在c中创建动态数组会在realloc()时出错

时间:2016-05-22 06:25:33

标签: c arrays dynamic compiler-warnings realloc

我试图在C中编写一个动态数组,我几乎做到了。现在我'使用realloc()插入错误时,它会陷入错误的位置。这是我的代码:

   #include<stdio.h>
   #include<stdlib.h>

   typedef struct {

     int *array;//pointer that points to the start of the contiguous  allocated blocks(an array of int)

     size_t used;//array used

     size_t size;//array total size
   }D_Array;


   void alloc_array(D_Array *a, int initial_size)
  {
    //allocate contiguous memory blocks and point a pointer to its beginning address...
    a->array = (int*)malloc(initial_size*sizeof(int));
    a->used = 0;
    a->size = initial_size;
  }


  void insert_array(D_Array *a, int element)
  {
   if(a->used == a->size)
   {
    //allocate one more space and then insert in array
    a->array = (int*)relloc(a->array,(a->size)*sizeof(int)); 
   }
    a->array[a->used++] = element;
  }


  void free_array(D_Array *a)
  {
   free(a->array);
   a->array = NULL;
   a->used = a->size = 0;
  }

  int main()
  {

   D_Array a; 
   int i=0, initial_size=0, insert_element=0;

   printf("Enter the initial size of array :");
   scanf("%d",&initial_size);
   alloc_array(&a, initial_size);

   printf("\nEnter the elements to be inserted initially");
   for(i=0 ; i<initial_size ; ++i)
   {
    scanf("%d",&insert_element);
    insert_array(&a, insert_element);
   }
    a.array[0] = 3;
   for(i=0 ; i<initial_size ; ++i)
   {
    printf("%d",*((a.array)+i));
   }
  }

问题出在方法&#34; insert_array&#34;但我不知道为什么。我觉得一切都很好。

[从comment更新:]

编译器给出:

quicksort.c:32:14: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] a->array = (int*)relloc(a->array,(a->size)*sizeof(int)); ^ /tmp/ccXTwlHh.o: In function insert_array': quicksort.c:(.text+0x8d): undefined reference to relloc' collect2: error: ld returned 1 exit status

2 个答案:

答案 0 :(得分:4)

realloc电话有两个问题:第一个问题是如果realloc失败并返回NULL会发生什么。这就是你永远不应该重新分配给传递给realloc电话的变量的原因。

第二个问题,以及可能导致您出现问题的原因是您实际上没有调整数组,而是使用与以前完全相同的大小重新分配它,这意味着当你接下来做

a->array[a->used++] = element;

您正在索引越界,并且未定义行为

答案 1 :(得分:2)

添加到已经说过的内容,您已经写了relloc而不是realloc。所以可能有一个拼写错误的汇编。