对具有动态数组的结构指针使用内存分配(realloc)时出错

对具有动态数组的结构指针使用内存分配(realloc)时出错,c,function,memory-management,std,C,Function,Memory Management,Std,vector_int.h是一个具有自制动态数组(vector)结构的头文件 c是一个测试程序 所有代码如下: 向量_int.h: 我认为使用realloc函数有错误,但我认为我做得很好。 请帮助我找出一个或多个错误。您有一些问题: 隐式声明/realloc问题是因为需要为realloc签名包含stdlib.h。如果没有函数签名,编译器将对函数参数和返回值进行一些假设,然后在链接过程中,如果这些假设与实际函数实现不匹配,链接器会对此进行投诉 您正在传递realloc一个尚未初始化的地址。这是自

vector_int.h是一个具有自制动态数组(vector)结构的头文件

c是一个测试程序

所有代码如下:

向量_int.h:

我认为使用realloc函数有错误,但我认为我做得很好。
请帮助我找出一个或多个错误。

您有一些问题:

  • 隐式声明/realloc
    问题是因为需要为
    realloc
    签名包含
    stdlib.h
    。如果没有函数签名,编译器将对函数参数和返回值进行一些假设,然后在链接过程中,如果这些假设与实际函数实现不匹配,链接器会对此进行投诉

  • 您正在传递
    realloc
    一个尚未初始化的地址。这是自找麻烦。在使用
    向量
    变量之前,请执行一些初始化操作:

    vector->array = NULL;
    vector->len = 0;
    
  • 此外,您使用的
    realloc
    是不正确的:它不会改变您给它的实际指针,只会改变指向它的内存块的大小。您需要自己重新分配指针。请注意,
    realloc
    在失败时可以返回
    NULL
    ,因此请执行以下操作:

    tmp = realloc(vector->array, size * sizeof(int));
    
    if (tmp != NULL)
    {
        vector->array = tmp;
        vector->len = size; // Changing of length variable
    }
    else handleAllocError();
    
  • 最后,不要在标题中定义函数。这将起作用,但最好有一个实现文件
    vector_int.c
    ,该文件定义了头文件中声明的函数


    • 您需要一个
      +1
      在这里:

          ResizeVectorInt(&vector, cell_number + 1); // Grow size of memory if it's not enough
      

      另外,
      vector
      从未初始化,因此对realloc的第一次调用是未定义的。非常感谢!现在程序正在编译,但没有handleAllocError()。[Linker error]C:\Users\ALEXAN~1\AppData\Local\Temp\ccGPxG6V.o:test.C:(.text+0x57):未定义对“handleAllocError”的引用考虑
      handleAllocError
      伪代码:如果
      realloc
      失败,您需要自行决定该怎么做。它可以像
      printf
      /
      log
      一样简单。因此,删除
      handleAllocError
      并添加您自己的代码来处理
      realloc
      故障。
      vector->array = NULL;
      vector->len = 0;
      
      tmp = realloc(vector->array, size * sizeof(int));
      
      if (tmp != NULL)
      {
          vector->array = tmp;
          vector->len = size; // Changing of length variable
      }
      else handleAllocError();
      
          ResizeVectorInt(&vector, cell_number + 1); // Grow size of memory if it's not enough