我正在编写一个简单的c程序,它将文本文件中的行读入char**。在主函数中,我创建char*数组,为它分配内存,并将指向该数组的指针传递给另一个函数,用一个char*填充数组中的每个索引,char*表示文本文件中每一行的内容。
出于与我的内存管理相关的原因,我猜,我在while循环的第三次迭代中收到了一个分段错误,它将字符串复制到字符串数组中。这是为什么?
我的代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void getRestaurants(char ***restaurantsArray) {
FILE *restaurantsFile = fopen("./restaurants.txt", "r");
char *restaurant = (char *)malloc(50 * sizeof(char));
char *restaurantCopy = restaurant;
//fopen will return null if it is unable to read the file
if (restaurantsFile == NULL) {
free(restaurant);
return;
}
int index = 0;
while (fgets(restaurantCopy, 50, restaurantsFile)) {
// segfault occurs the third time the following line is executed
*restaurantsArray[index] = (char*)malloc(50 * sizeof(char));
strcpy(*restaurantsArray[index], restaurantCopy);
printf("%s", restaurantCopy);
printf("%s", *restaurantsArray[index]);
index++;
}
fclose(restaurantsFile);
free(restaurant);
}
void main() {
char **restaurantsArray = (char **)malloc(100 * sizeof(char *));
char **restaurantsArrayCopy = restaurantsArray;
getRestaurants(&restaurantsArrayCopy);
}
预期结果:
firstline
firstline
secondline
secondline
thirdline
thirdline
等等,如果提供的restaurants.txt文件包含:
firstline
secondline
thirdline
最佳答案
在getRestaurants
中,restaurantsArray
声明为char ***Array
。在*restaurantsArray[index] = …;
行中,它接受restaurantsArray[index]
并尝试将其用作指针(通过应用*
运算符)。但是restaurantsArray
只是指向restaurantsArrayCopy
中main
的指针。restaurantsArrayCopy
只是单个对象,而不是数组。它只是一个char **
。在getRestaurants
中,对restaurantsArray[index]
使用index
和除零以外的任何值都会使用一些未定义的值。
无需将&restaurantsArrayCopy
从main
传递到getRestaurants
。只要通过restaurantsArray
。这是指向已分配空间的指针。
然后,在getRestaurants
中,不使用*restaurantsArray[index] = …;
,而使用restaurantsArray[index] = …;
。这将为*
中的元素分配一个值,这是您要做的。同样,删除restaurantsArray
中的*
和strcpy
。