【发布时间】:2014-11-02 04:58:01
【问题描述】:
我已经对此进行了调试,但无法弄清楚为什么我的 fgets 无法正常工作。在我更改代码以动态调整数组大小之前,fgets 运行良好。由于我是 C 初学者,这个问题困扰了我很长时间。
这是错误代码:
int readNumbers(int **array, char* fname, int hexFlag) {
int numberRead = 0;
FILE* fp;
int counter = 0;
char arr[100];
char* ptr;
size_t curSize = 16;
int radix = hexFlag ? 16 : 10;
*array = malloc(0 * sizeof(*array));
fp = fopen(fname, "r");
if (fp == NULL) {
printf("Error opening file\n");
return -1;
}
while (fgets(arr, sizeof(arr), fp)) { //Seg faults here when it reaches end of file.
ptr = strtok(arr, " \n");
while(ptr) {
if (counter >= curSize) {
curSize += 16;
array = realloc(*array, curSize * sizeof(**array));
}
(*array)[counter++] = strtol(ptr, NULL, radix);
++numberRead;
ptr = strtok(NULL , " \n");
}
}
if (ferror(fp)) {
fclose(fp);
return -1;
}
这是改变数组大小之前的工作代码:
int readNumbers(int array[], char* fname, int hexFlag) {
int numberRead = 0;
FILE* fp;
int counter = 0;
char arr[100];
char* ptr;
fp = fopen(fname, "r");
if (fp == NULL) {
printf("Error opening file\n");
return -1;
}
while (fgets(arr, sizeof(arr), fp)) {
ptr = strtok(arr, " \n");
while(ptr) {
if (hexFlag == 0) {
array[counter++] = strtol(ptr , NULL , 10);
} else {
array[counter++] = strtol(ptr, NULL, 16);
}
++numberRead;
ptr = strtok(NULL , " \n");
}
}
if (ferror(fp)) {
fclose(fp);
return -1;
}
到达文件末尾时,新添加的更改段错误。我强烈怀疑这与双指针有关。任何帮助都非常感谢!
【问题讨论】:
-
你认为它会起作用吗..?
*array = malloc(0 * sizeof(*array)); -
@AmitSharma 啊!我明白了,这解决了它!但我不明白这将如何导致 fgets 仅在文件末尾而不是立即出现段错误。
标签: c segmentation-fault fgets