【发布时间】:2016-01-27 17:01:22
【问题描述】:
在我的主程序运行任何能够导致段错误的重要代码之前,我就收到了段错误。也就是说,printf("before main functionality starts\n"); 没有运行。
什么可能导致这个问题?
int main() {
printf("before main functionality starts\n");
person* people = create();
//Make new file and write into it
printf("\nWriting into file\n");
char file_name[] = "people_list";
int file_number = open(file_name, O_CREAT|O_WRONLY, 0644); //only owner can read/write, rest can only read
int error_check;
error_check = write(file_number, people, sizeof(&people) ); //reads array into file
if(error_check < 0) {
printf("ERROR: %s\n", strerror(errno));
return -1;
}
close(file_number);
//Read from new file
printf("\nReading from file...\n");
person* new_people[10];
file_number = open(file_name, O_RDONLY); //reopens file, now with data
error_check = read(file_number, new_people, sizeof(people));
if(error_check < 0) {
printf("ERROR: %s\n", strerror(errno));
return -1;
}
close(file_number);
【问题讨论】:
-
将代码放在问题中而不是屏幕截图是首选
-
我很抱歉。发展偏头痛,我的终端拒绝与我的复制粘贴企业合作。
-
您出现了段错误,因为您正在取消引用未初始化的指针 (
first)。您没有看到“woops”是因为您没有刷新输出流,而不是因为没有调用printf。 -
你能解释一下刷新输出流是什么意思吗?我对 C 语言还是比较陌生。
-
@CodeSammich 如果 C 运行时在每次写入标准输出流时都会自动刷新它,那么对于
printf来说这将是一件极其昂贵的事情。相反,每次遇到换行符时它都会刷新流缓冲区。您可以通过在字符串"woops\n"的末尾打印一个换行符来导致刷新,在下一个换行符fflush(stdout)之前显式刷新它或使用无缓冲输出fprintf(stderr, "woops")。
标签: c segmentation-fault main