【发布时间】:2017-07-31 23:53:36
【问题描述】:
我正在编写一个香草文件读取代码。
大部分看起来像这样。
首先是头文件file.h
// fheader.h
#ifndef __file_h__
#define __file_h__
// start from here
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void readFile(FILE *fr);
FILE* openFile(char *file_name);
#endif
主文件fmain.c
#include "fheader.h"
void readFile(FILE *fr) {
// Added Printf
printf("\n...\n");
printf("\n...\n");
printf("\n...\n");
printf("\n...\n");
char *buffer = calloc(sizeof(char),1);
while(!feof(fr)) {
fread(buffer,sizeof(char),1,fr);
printf("%s\n",buffer);
}
free(buffer);
return;
}
FILE* openFile(char *file_name) {
// printf("the file name that is going to be opened is %s",file_name);
FILE *fr;
fr = fopen(file_name,"r");
return fr;
}
int main(int argc,char *argv[]) {
if(argc < 2) {
printf("USAGE: ./file test.txt\n");
return 1;
}
if (argc > 2) {
printf("ERROR: Too many argument\n");
return 1;
}
FILE *fr;
char *file_name = calloc(strlen(argv[1]),sizeof(char));
strncpy(file_name,argv[1],strlen(argv[1]));
fr = openFile(file_name);
printf("\nReading from file\n");
readFile(fr);
fclose(fr);
free(file_name);
return 0;
}
我使用以下命令编译了代码
gcc -g3 -Wall fmain.c -o file.o
当我运行代码时
./file.o "~/workspaces/myWork/C_experiment/test.txt"
我看到Segmentation fault: 11
但是当我在 lldb 中运行上述程序时,我工作并以返回码 0 退出
lldb ./file.o
(lldb) run "~/workspaces/myWork/C_experiment/test.txt"
// output of the file
Process 28806 exited with status = 0 (0x00000000)
(lldb) quit
现在,我对如何调试代码并找到 Seg Fault 原因一无所知。
【问题讨论】:
-
使用核心转储至少可以看到它崩溃时的位置。
-
顺便说一句,您没有显示编译代码时使用的“以下命令”。
.o文件扩展名让我怀疑该命令的正确性。 -
你没有检查
openFile成功。如果openFile无法打开文件(例如因为它不存在),它会返回NULL并且readfile将表现出未定义的行为(很可能会崩溃)。可能还有更多问题。 -
char *buffer = calloc(sizeof(char),1);如果缓冲区大小在编译时已知,则毫无意义,只需编写char buffer[1](无论如何都是错误的,请参阅下面的答案)。 -
@Ruslan 更新编译命令。
标签: c file segmentation-fault