我已经调试了这个问题,但无法弄清楚为什么我的 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))
这里这个malloc
调用不会分配任何内存。
除了Amit Sharma指出的问题之外:
您最初使用以下方式分配动态数组:
*array = malloc(0 * sizeof(*array));
当您存储到动态数组中时,您使用:
(*array)[counter++] = strtol(ptr, NULL, radix);
但是,您后续的重新分配将使用:
array = realloc(*array, curSize * sizeof(**array));
可能应该是:
*array = realloc(*array, curSize * sizeof(*array));
请注意,使用
malloc(0)
是可以的(不常见,但并非闻所未闻),只要您的代码准备好处理 NULL
指针返回或无法读取或写入的分配。