gpt4 book ai didi

c - fput 上的段错误

转载 作者:行者123 更新时间:2023-11-30 17:12:57 28 4
gpt4 key购买 nike

总的来说,我对 C 语言和内存分配还很陌生。基本上我想做的是复制未知大小的输入文件的内容并使用递归反转其内容。我觉得我已经非常接近了,但是当我尝试放入我认为是文件反转内容的内容时,我不断遇到段错误(我认为是因为我认为我做得正确...... )

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int recursive_back(char **lines, int lineNumber, FILE *input) {

char *input_line = malloc(sizeof(char) * 1000);
lines = realloc(lines, (lineNumber) * 1000 * sizeof(char));
if(fgets(input_line, 201, input) == NULL) {
*(lines + lineNumber) = input_line;
return 1;
}
else {
printf("%d\n", lineNumber);
return (1+recursive_back(lines, ++lineNumber, input));

}

}

void backward (FILE *input, FILE *output, int debugflag ) {
int i;
char **lines; //store lines in here
lines = malloc(1000 * sizeof(char *) ); //1000 lines

if(lines == NULL) { //if malloc failed
fprintf(stderr, "malloc of lines failed\n");
exit(1);
}

int finalLineCount, lineCount;
finalLineCount = recursive_back(lines, 0, input);

printf("test %d\n", finalLineCount);

for(i = finalLineCount; i > 0; i--) {
fputs(*(lines+i), output); //segfault here
}

}

我正在使用一个简单的输入文件来测试代码。我的输入文件有 6 行长,上面写着“这是一个测试输入文件”。实际的输入文件在另一个函数中打开并传递给后向函数。自从我尝试了不同的选项以来,我已经验证了程序中的其他功能是否有效。这两个函数是我唯一遇到问题的函数。我做错了什么?

最佳答案

您的问题在这里:

lines = realloc(lines, (lineNumber) * 1000 * sizeof(char));

正如@ooga所说。它至少存在三个独立的问题:

  1. 您正在重新分配 recursive_back() 指向的内存块的局部变量 lines ,并将新地址(假设重新分配成功)存储回该局部变量中。新位置不一定与旧位置相同,但指向它的唯一指针是一个局部变量,该变量在 recursive_back() 末尾超出范围。 。调用者的相应变量没有改变(包括当调用者是 recursive_back() 本身时),因此在 recursive_back() 之后不能再被依赖为有效指针。返回。

  2. 您使用错误的类型分配空间。 lines类型为char ** ,因此它指向的对象的类型为 char * ,但您要根据 char 的大小预留空间相反。

  3. 您没有预留足够的空间,至少在第一次调用时,lineNumber为零。在该调用中,当请求的空间恰好为零字节时, realloc() 的效果是释放lines指向的内存。在后续调用中,分配的空间始终比您认为分配的空间少一行。

看起来像 realloc()如果您可以依赖最多 1000 行的输入,则完全没有必要,因此您应该考虑将其删除。如果您确实需要能够以调用者将看到的方式重新分配,那么调用者需要将指针传递给其变量,以便 recursive_back()可以通过该指针修改它。

关于c - fput 上的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31151356/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com