【发布时间】:2019-03-30 17:38:42
【问题描述】:
我正在解决数据结构分配的编码问题,当使用 fgets() 读取文本文件的最后一行时,我的解决方案的一部分一直给我一个 segfault: 11。
我已经在 StackOverflow 上搜索了一段时间,但找不到与我遇到的相同的错误。我尝试了很多方法来解决这个问题,但我无法弄清楚到底是什么问题。
int main() {
**S = func();
free(S);
return 0;
}
char** func() {
FILE *fStrings = fopen("file.txt", "r");
if (fStrings == NULL) printf("Error opening 'file.txt'\n")
int length = fileLength("file.txt"); // This returns just the number of lines in a file, works as intended.
char **strings = (char **)malloc(200 * length * sizeof(char));
f(length, (char (*)[200])strings, *fStrings);
// some code using the data modified by f()
fclose(fStrings);
return strings;
}
void f(int length, char strings[][200], FILE *fStrings) {
int i;
for (i = 0; i <= length; i++) {
printf("i = %d\n", i); // debug
fgets(strings[i], 200, fStrings); // Here's the problem
printf("string = %s\n", strings[i]); // debug
}
}
上面的代码有 2 个调试行,可以查看错误发生的确切位置。使用正确的参数调用函数,其中length 是数组中字符串的数量,strings 是字符串数组,fStrings 是包含所述字符串的文件。
segfault 在尝试读取文本文件的最后一行时出现。任何帮助将不胜感激。
编辑:更改了代码块以包含我的代码的更好版本,以防它更容易理解。还包括正确的库。
【问题讨论】:
-
您的指针计算不起作用。为什么不正确使用数组,比如
strings[i],就像你在printf中所做的那样?出于好奇,您是在哪里学会这样做的? -
@SamiKuhmonen 指针计算很奇怪,为什么不行?
-
您需要向我们展示您是如何调用函数的,以及如何定义和初始化参数。
-
@4386427 因为数组数组不一定在连续的内存中。它们可以在任何地方,因此无法访问结束。
-
for (i = 0; i <= length; i++) {==>for (i = 0; i < length; i++) {
标签: c segmentation-fault fgets