带有动态内存分配的C追加函数

带有动态内存分配的C追加函数,c,arrays,append,dynamic-memory-allocation,C,Arrays,Append,Dynamic Memory Allocation,接下来,我尝试修改中提供的代码,使用动态内存分配创建一个append函数。这就是我到目前为止所做的: #包括 #包括 类型定义结构intlist\u{ 整数大小; int*列表; }intlist; 无效附加(intlist*arr,int值){ realloc((*arr.list),sizeof((*arr.list)+sizeof(int)); (*arr.size=(*arr.size+1; (*arr.list[(*arr.size-1]=值; } int main(){ intlis

接下来,我尝试修改中提供的代码,使用动态内存分配创建一个
append
函数。这就是我到目前为止所做的:

#包括
#包括
类型定义结构intlist\u{
整数大小;
int*列表;
}intlist;
无效附加(intlist*arr,int值){
realloc((*arr.list),sizeof((*arr.list)+sizeof(int));
(*arr.size=(*arr.size+1;
(*arr.list[(*arr.size-1]=值;
}
int main(){
intlist arr;
arr.size=4;
arr.list=malloc(arr.size*sizeof(int));
arr.list[0]=0;
arr.list[1]=5;
arr.list[2]=3;
arr.list[3]=64;
追加(&arr,12);
用于(int ii=0;ii
然而,我得到的结果是错误的:

clang版本7.0.0-3~ubuntu0.18.04.1(标签/发行版\u 700/最终版) main.c:10:3:警告:忽略用声明的函数的返回值 “警告未使用的结果”属性[-Wunused result] realloc((*arr.list),sizeof((*arr.list)+sizeof(int)); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 生成1个警告。 0,5,3,64,0,5,3,64,12

我使用它进行测试,您可以在其中看到上述代码的最新版本。如果您能帮助我知道我的错误在哪里,以及如何解决,我将不胜感激。提前感谢您的支持

p.S.您可以在此处找到代码的最终版本。

关闭,但是:

  • sizeof((*arr.list)
    不会给出数组的大小。相反,它会给你一个
    int*
    的大小
  • realloc
    使原始指针无效,继续使用它是未定义的行为。改为使用返回的值
  • 因此,将realloc行更改为使用存储的列表大小,并使用返回值更新指针:

    (*arr).list = realloc((*arr).list, ((*arr).size + 1) * sizeof(int));
    
    其他几点提示:

    • ptr->
      (*ptr)相同。
      但更易于阅读。我建议将您的
      (*arr).size
      (*arr).list
      更改为
      arr->size
      arr->list
    • realloc
      ,就像它的兄弟一样,并不能保证成功。您应该检查
      null
      的返回值以捕获错误
    • 叮当声警告(通常情况下)很有帮助-检查返回值可以解决几个问题
        • 错误的大小分配
          sizeof((*arr.list)
          是指针的大小,而不是
          int

        • 未使用返回值
          realloc()
          返回新指针

        • NULL
          检查

        不要使用容易出错的
        ptr=some_alloc(sizeof(type)*n)
        ,而是使用
        ptr=some_alloc(sizeof*ptr*n)



        你为什么认为结果是错误的?我试图编译它,得到了正确的结果。@emig。你是对的。我在原来的帖子中犯了一个可怕的错误,忘记了对第一个for loop out进行评论(遗憾。不过,我收到的警告仍然是个问题。谢谢。当时似乎也是错误的。但是,您的解决方案没有删除该警告。
        realloc((*arr).list,(*arr.size+1)*sizeof(int));
        -->不。重新分配的值已被丢弃。只有UB才能继续工作。@chux请您详细说明一下,它似乎工作得很好。@Foad许多重新分配都没有使用新的内存区域,您的代码到目前为止依赖于此。继续调用/this
        append()
        代码将失败。非常感谢。我不理解
        *(arr->list)
        1u
        。我还认为行
        arr->list[arr->size]=value;
        应该是
        arr->list[arr->size-1]=value;
        不应该是吗?@Foad
        sizeof*(arr->list)
        arr->list
        指向的大小。使用
        int*list;
        ,在
        int
        中指向的类型指针。顺便说一句
        new\u arr==NULL
        应该更改为
        new\u ptr==NULL
        @Foad分配使用
        size\u t
        参数,一些无符号类型。
        arr->size+1u
        使用
        无符号添加1
        math而不是
        int math
        形成尺寸乘积。@Foad“我还认为行arr->list[arr->size]=value;应该是arr->list[arr->size-1]=value;不是吗?”。不。实际上,您希望
        arr.list[4]=12;
        此代码在增加
        尺寸之前进行赋值。
        
        void append(intlist *arr, int value){
          int *new_ptr = realloc(arr->list, sizeof *(arr->list) * (arr->size + 1u));
          if (new_ptr == NULL) {
            fprintf(stderr, "Out of memory\n");
            exit (EXIT_FAILURE);
          }
          arr->list = new_ptr;
          arr->list[arr->size] = value;
          arr->size++;
        }