我已经调试了这个,并且无法弄清楚为什么我的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;
}
当到达文件末尾时,新添加的更改会出现故障。我强烈怀疑这与双指针有关。非常感谢任何帮助!
答案 0 :(得分:1)
没有通过整个代码。但*array = malloc(0 * sizeof(*array))
此处此malloc
调用不会分配任何内存。
答案 1 :(得分:1)
除了问题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
,这是不正常的(但不是闻所未闻)来自或写入。