[英]segfault when reading last line of file using fgets()
我正在解决数据结构分配的编码问题,我的解决方案的一部分一直给我一个段错误segfault: 11
当使用fgets()读取文本文件的最后一行时。
我已经在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
尝试读取文本文件的最后一行时,会发生。 任何帮助将不胜感激。
编辑:更改了代码块以包含更好的代码版本,以防它更容易理解。 也包括正确的库。
我认为你的代码的主要问题是这一行
for (i = 0; i <= length; i++) {
由于<=
它将循环“长度+ 1”次,但您只为“长度”时间分配了内存。 将其更改为:
for (i = 0; i < length; i++) {
你的分配很奇怪。 您应该使用指向1D数组的指针来分配2D数组,例如:
char (*strings)[200] = malloc(length * sizeof *strings)
然后你可以在没有演员的情况下进行通话。
还注意到这一行:
f(length, (char (*)[200])strings, *fStrings);
^
notice
我不认为你想在fStrings
前面*
(甚至不应该用*
编译)
通过正确的分配(如上所述),呼叫应该是:
f(length, strings, fStrings);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.