我正在解决数据结构作业的编码问题,当使用 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
包含所述字符串的文件。
尝试读取文本文件的最后一行时会发生段错误
。任何帮助将不胜感激。
编辑:更改了代码块以包含我的代码的更好版本,以防它更容易理解。正确的库也包含在内。
最佳答案
我认为您的代码的主要问题是这一行
for (i = 0; i <= length; i++) {
由于 <=
它将循环“length + 1”次,但您只分配了“length”次内存。将其更改为:
for (i = 0; i < length; i++) {
你的分配很奇怪。您应该使用指向 1D 数组的指针分配 2D 数组,即像这样:
char (*strings)[200] = malloc(length * sizeof *strings)
然后你就可以在没有任何 Actor 的情况下进行通话。
也刚刚注意到这一行:
f(length, (char (*)[200])strings, *fStrings);
^
notice
我认为你不想*
前面fStrings
(它甚至不应该使用 *
进行编译)
通过正确的分配(如上所述),调用应该是:
f(length, strings, fStrings);
关于c - 使用 fgets() 读取文件最后一行时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55434053/