【问题标题】:C dynamic allocation with realloc of a char**使用 char 的 realloc 进行 C 动态分配**
【发布时间】: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


【解决方案1】:

您将*Dfile 传递给realloc()

您的意思是改为传递Dfile 吗?

【讨论】:

  • **Dfile 是指向 char 的指针。所以我希望向它“添加”更多的 char*-Pointers。
  • Dfile 是一个指向字符串的指针,对吧?你有太多的字符串,所以你需要添加更多的指针,而不是更多的字符。 -- 相反,您所做的是重新分配第一行,然后将结果指针分配给 Dfile,这很可能会导致某种崩溃。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 1970-01-01
  • 2015-09-25
  • 2014-02-19
  • 1970-01-01
相关资源
最近更新 更多