【发布时间】:2016-01-10 04:03:42
【问题描述】:
我是新来的,英语说得不太好。 我有一个关于我的代码(C 语言)的问题。
代码应该做什么:
存在一个名为“g.txt”的文件,应该打开它。然后它逐行读取它并将每一行复制到缓冲区(zpuffer[200])中,之后应该使用 strcpy 将缓冲区的内容复制到**Dfile。 **Dfile 指向一个char*,它的空间首先分配给malloc。如果**Dfile没有足够的空间来保存,代码会执行realloc,这应该会腾出更多的空闲空间。
第一次调用realloc,我居然得到了更多的空间!但是第二次,它没有用;操作系统 Ubuntu 说(德语):“Bus-Zugriffsfehler (Speicherabzug geschrieben)”。英文:“总线访问错误(写转储)”
这是我的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OBJS 10 //new Lines a one time for **Dfile
int main(void){
FILE *datei;
datei=fopen("g.txt", "r");
if (datei == NULL){
fprintf(stderr, "\nFEHLER\n");
return 1;
}
char zpuffer[200]; //buffer
char **Dfile; //save content of g.txt line by line, every line has its own index
int zeilen = 0; //the actual amount of lines
int speicher = 0; //total indices in **Dfile
Dfile = (char**)malloc(sizeof(char**)*(speicher + OBJS));
speicher += OBJS;
while (fgets(zpuffer, 199, datei) != NULL){
if (speicher <= zeilen){//speicher <= zeilen --> allocate memory
Dfile = (char**)realloc(*Dfile, sizeof(char**)*(speicher + OBJS)); //!!ERROR!! but just the second time!!
if (Dfile == NULL){
fprintf(stderr, "\nFEHLER Alloc\n");
return 1;
}
speicher += OBJS;
}
Dfile[zeilen]=malloc(strlen(zpuffer)+1);
strcpy(Dfile[zeilen++], zpuffer);
printf("%s", Dfile[zeilen - 1]);
}
return 0;
}
有人可以帮帮我吗?
【问题讨论】:
-
Dfile = realloc(Dfile, sizeof *Dfile * (speicher+OBJS));(和Dfile = malloc(sizeof(*Dfile *(speicher + OBJS));)或者:Dfile = malloc(sizeof(char*) * (speicher + OBJS));如果你愿意,但这更容易出错......另外:你不需要最初的 malloc();ptr = realloc(NULL, new_size);按预期工作。 -
首先 - 测试 mallic 的结果。第二次在调试器下运行程序,你不说什么平台所以我不能说你需要什么调试器
-
附加
fgets(zpuffer, 199, datei)->fgets(zpuffer, 200, datei). -
我用的是 ubuntu。其实我测试了代码,错误来自realloc
-
即使你的英文不好,也要尽量用英文写所有的 cmets,尤其是 variable identifiers。下一个最好的事情是用德语始终如一地做。只是一个建议;)
标签: c memory char allocation realloc