一般情况下,我对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行长,上面写着“这是一个测试输入文件”。实际输入文件将在另一个函数中打开并传递给向后函数。我已经证实了我的程序中的其他功能,因为我一直在玩不同的选择。这两个函数是我唯一有困难的功能。我做错了什么?
发布于 2015-07-01 02:48:49
你的问题是:
lines = realloc(lines, (lineNumber) * 1000 * sizeof(char));就像胡加说的那样。它至少有三种不同的问题:
recursive_back()的局部变量lines所指向的内存块,并将新地址(假设重新分配成功)存储到该局部变量中。新位置不一定与旧的位置相同,但指向它的唯一指针是在recursive_back()结束时超出作用域的局部变量。调用者的相应变量不会更改(包括调用方本身是recursive_back()本身),因此在recursive_back()返回后不再依赖于它是有效指针。lines有char **类型,因此它指向的对象具有char *类型,但是您将根据char的大小来保留空间。lineNumber为零时,您没有预留足够的空间,至少在第一次调用时是这样。在该调用中,当请求的空间完全为零字节时,realloc()的效果是释放lines所指向的内存。在随后的调用中,所分配的空间总是比您认为所分配的值低的一行。如果您可以依赖输入最多有1000行,那么realloc()看起来是完全没有必要的,所以您应该考虑删除它。如果您确实需要以调用者将看到的方式重新分配,那么调用方需要传递指向其变量的指针,以便recursive_back()可以通过该指针修改它。
https://stackoverflow.com/questions/31151356
复制相似问题