【问题标题】:Malloc Realloc FreeMalloc Realloc 免费
【发布时间】:2014-01-05 23:51:01
【问题描述】:

您好,我在大学的一个练习我需要用这种方式 malloc 一个数组。 stars 的数组有 1 个插槽。如果输入多于一个,则数组加倍。如果输入超过 2,那么它会再次加倍,等等。在此之后,我必须裁剪数组以适应输入的数量。例如,如果我有 5 个输入,那么数组将有 8 个插槽,我必须让它有 5 个插槽,但我不知道该怎么做。到目前为止,这是我的代码:

nameInfoT* ReadNames(int* size){
    nameInfoT* names ;
    int array_size=1;
    int entries=0;
    char input[length];
    names=(nameInfoT*) malloc(sizeof(nameInfoT)*array_size);

    do{
        scanf("%s",input);
        if(!strcmp(input,"END")) break;

        if(entries==array_size){
            array_size=array_size*2;
            names= (nameInfoT*) realloc(names,sizeof(nameInfoT)*array_size);
        }

        names[entries].name=(char*)malloc(sizeof(char)*strlen(input));
        strcpy(names[entries].name,input);

        entries++;

    }while(1);

    printf("there are %d free spaces \n",array_size-entries);
    *size=entries;
    printf("there are %d entries \n",*size);

    int i;
    for(i=array_size;i>entries;i--){
        free(names[i]);//here it won't compile 
    }
    return names;

}

【问题讨论】:

  • 不要投mallocs.
  • 不要将scanf"%s" 一起使用!请改用 fgets 或 POSIX getline。只是出于好奇:你的大学有没有教过你像这样使用scanf
  • @mafso 是的...我们认为它等同于 fgets 或 getline

标签: c malloc free realloc


【解决方案1】:

你只能freemalloc/calloc/realloc的结果。您不能释放单个元素。所以最后你可以简单地再次realloc 到所需的最终大小。

【讨论】:

  • 我认为 realloc 只会带来额外的空间。我不知道它可以删除空间。谢谢!
  • @Mario:“移除空间”是有道理的:-)
【解决方案2】:

您还有其他几个问题:
1) 为输入字符串分配空间时,需要加1以保留尾随的'\0'
2) 在你重新分配之前,你应该有一个 switch 语句,它将采用 array_size 并使用它来确定新的大小。如果我理解你的问题,你想从 1 -> 2 -> 4 -> n (其中 n 是下一个数字)。您的 realloc 代码每次都会翻倍。你需要改变它。
3) 当你释放条目时,你需要小心,因为你似乎没有释放类/结构的“名称”成员。
4)释放循环中的成员后,然后对名称类/结构进行一次释放。

我以后可以更仔细地研究一下。

【讨论】:

    猜你喜欢
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 2018-02-04
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    相关资源
    最近更新 更多