使用函数增加动态数组大小;免费错误,下一个尺寸无效(快)

时间:2017-01-04 12:25:10

标签: c arrays function pointers dynamic-arrays

我需要创建一个动态数组并放入五个数字,之后还有另一个输入,即我需要增加多少数组大小。 当所有输入结束时,我将增加数组大小并将数字放入其中。

一切正常,但免费给我这个错误:" free():无效的下一个尺寸(快):0x00000 ......"

我认为里面有错误"延伸"功能

void extend(int *V, int n, int s)
{
    int *pt;
    pt = realloc(V, n*sizeof(int));
    int i;
    pt[5]=s;
    for(i=6;i<(5+n);i++)
        pt[i] = pt[i-1]*2;
}

int main()
{
    int *v;
    int n,i, sum;
    sum = 0;

    v = malloc(sizeof(int)*5);

    for(i=0;i<5;i++)
    {
        scanf("%d", &v[i]);
        sum+=v[i];
    }   

    scanf("%d", &n);

    extend(v,n,sum);

    for(i=0;i<(5+n);i++)
        printf("%d\n", v[i]);
    free(v);
    return 0;
}

4 个答案:

答案 0 :(得分:2)

该函数不会更改原始变量v。它应该至少定义为

void extend(int **V, int n, int s)
{
    int *pt;
    pt = realloc(*V, n*sizeof(int));
    if ( pt )
    {
        int i;
        pt[5]=s;
        for(i=6; i < n; i++)
        pt[i] = pt[i-1]*2;
        *V = pt; 
    }
}

或者

int extend(int **V, int n, int s)
{
    int *pt;

    pt = realloc(*V, n*sizeof(int));
    int success = pt != NULL;

    if ( success )
    {
        int i;
        pt[5]=s;
        for(i=6; i < n; i++)
        pt[i] = pt[i-1]*2;
        *V = pt; 
    }

    return success;
}

该功能应该叫做lije

extend( &v,n,sum);

考虑到该函数是不安全的,因为通常n可以小于或等于5.并且此语句

for(i=6;i<(5+n);i++)
          ^^^^

会导致未定义的行为。

或者该函数应分配n + 5个元素。例如

    pt = realloc(*V, ( n + 5 )*sizeof(int));
                     ^^^^^^^^

此幻数5的使用还不清楚,没有意义。

答案 1 :(得分:0)

好吧,在功能extend中:

  • 您正在将pt分配给n条目
  • 的内存块
  • 您正试图访问pt
  • 以外的索引n-1

更具体地说,有:

pt = realloc(V, n*sizeof(int));
for (i=6; i<(5+n); i++)
    pt[i] = ...

您正在执行非法内存访问操作:

  • pt[n]
  • pt[n+1]
  • pt[n+2]
  • pt[n+3]
  • pt[n+4]

答案 2 :(得分:0)

realloc返回指向新内存块的指针,但不会将其返回给调用者。相反v在main中,与调用之前的v相同,但现在无效,并且无疑会导致您的错误,最简单的是返回pt:

int* extend(int *V, int n, int s)
{
    int *pt;
    pt = realloc(V, n*sizeof(int));
    int i;
    pt[5]=s;
    for(i=6;i<(5+n);i++)
    pt[i] = pt[i-1]*2;
    return pt;
}
...
v = extend(v,n,sum);

另一件不正确的事情是你初始化新元素,n应该包含新元素的数量加上任何旧元素,因为你希望分配的块更大。更好地为它提供新旧元素:

int* extend(int *V, int oldNumber, int newNumber, int s)
{
    int *pt = realloc(V, newNumber*sizeof(int));
    int i;
    if (pt==NULL) 
    {
      fprintf(stderr,"Out of memory\n");
      return V;
    }
    pt[oldNumber]=s;
    // now you can initialize the rest of the array
    for(i=oldNumber+1;i<newNumber;i++) 
      pt[i] = pt[i-1]*2;
    return pt;
}
...
v = extend(v,5,n,sum);

答案 3 :(得分:0)

像这样成长一个数组

  int capacity = 10; // don't start off as tiny
  ENTRY *array = malloc(capacity * sizeof(ENTRY));
  int N = 0;   //number of entries.

添加

   int addentry(ENTRY *entry)
   {
      ENTRY *temp;

      if(N >= capacity)
      {
          temp = realloc(array, (capacity + capacity/2) * sizeof(ENTRY));
          if(!temp)
            goto out_of_memory;
          array = temp;
          capacity = capacity + capacity/2;
      }
      array[N] = *entry;
      N++;
      return 0;
    out_of_memory:
        //always a problem, maybe terminate program here
        // as it is, just shunt up
        return -1;
   }

你需要temp,因为realloc在失败时返回0但保持不变 参数完整,所以你需要保持数组来销毁它 优雅。增长约1.5,倍增过于激进 每次通话重新分配都太贵了。