global変数をブロック内から参照したい
可変長配列の可変長配列を飲み込んで
吐き出すコードです
global変数 *st_memory
こいつをブロック内から参照するには
どない書けば良いのでしょうか
構造体とか他の関数から引っぱり出しても
何故にかSegmentation faultで弾かれます
mallocとかgotoの処理は無視して下さい
_________________________
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define MAX 256
typedef enum{
SUCCESS,
EOF_FILE,
MEM_OVER
}Add_List;
char *st_memory = NULL; //global
void free_buffer(void){
free(st_memory);
st_memory = NULL;
}
Add_List add_char(const int ch,int *count){
static int buffer = 0;
assert(buffer >= *count);
if(buffer == *count){
st_memory = (char *)realloc(st_memory,
(buffer + MAX) * sizeof(char));
if(st_memory == NULL)return MEM_OVER;
buffer += MAX; }// END if
st_memory[*count] = ch;
(*count)++;
return SUCCESS;
} // END add_char(const int,int);
Add_List read_line(FILE *fp,char **line){
int ch,used_line = 0;
Add_List status = SUCCESS;
while((ch = getc(fp)) != EOF){
if(ch == '¥n'){
status = add_char('¥0',&used_line);
if(status != SUCCESS)goto FUNK_END;
break; } // END if
status = add_char(ch,&used_line);// MAIN
if(status != SUCCESS)goto FUNK_END;
}// END while
if(ch == EOF){
if(used_line > 0){
status = add_char('¥0',&used_line);
if(status != SUCCESS)goto FUNK_END;
}else{
status = EOF_FILE;
goto FUNK_END;
} // END if
} // END if
line[0] = (char *)malloc(sizeof(char) * used_line);
if(line[0] == NULL){ status = MEM_OVER;
goto FUNK_END; }
strcpy(line[0],st_memory);// MAIN
FUNK_END:
if(status != SUCCESS)free_buffer();
return status;
}// END read_line(FILE *,char **);
char ** add_line(char **text_file,char *mem_line,
int *line_alloc_num,int *line_num){
assert(*line_alloc_num >= *line_num);
if(*line_alloc_num == *line_num){
text_file = (char **)realloc(text_file,
(*line_alloc_num + MAX) * sizeof(char));
if(text_file == NULL)exit(0);
*line_alloc_num += MAX; } // END if
text_file[*line_num] = mem_line;
(*line_num)++;
return text_file;
} // END add_line(char **,char *,int *,int *);
char ** read_file(FILE *fp,int *line_p){
char **text_file = NULL;
int line_alloc_num = 0;
int line_num = 0;
char *mem_line = NULL;
while(read_line(fp,&mem_line) == 0){
text_file = add_line(text_file,
mem_line,&line_alloc_num,&line_num);
} // END while
text_file = (char **)realloc(text_file,
line_alloc_num * sizeof(char));
if(text_file == NULL)exit(0);
*line_p = line_num;
return text_file;
} // END read_file((FILE *,int *);
int main(void){
char **text = NULL;
int i,line_num = 0;
text = read_file(stdin,&line_num);
printf("¥n");
for(i=0;i<line_num;i++)
printf("%s¥n",text[i]);
return 0;
}
______________________
お礼
うまく実行できました、ありがとうございます。 最初は少し悩んだのですけど、見てみると、解けたので、とてもたすかりました。