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;
}
______________________
お礼
ありがとうございました。 無事アクセス違反のメモリーを発見しました。 三個しか確保していない配列の三番目の領域にアクセスしてました