C 使用函数增加动态数组大小;自由错误,下一个大小无效(快速)

C 使用函数增加动态数组大小;自由错误,下一个大小无效(快速),c,arrays,function,pointers,dynamic-arrays,C,Arrays,Function,Pointers,Dynamic Arrays,我需要创建一个动态数组并输入五个数字,然后再输入一个数字,即我必须增加数组大小的多少。 当所有输入结束时,我将增加数组大小,并将数字放入其中 一切正常,但免费返回此错误:“free():无效的下一个大小(fast):0x00000…” 我认为“extend”函数中存在错误 void扩展(int*V,int n,int s) { int*pt; pt=realloc(V,n*sizeof(int)); int i; pt[5]=s; 对于(i=6;i井,在函数extend中: 您正在将pt分配给

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

一切正常,但免费返回此错误:“free():无效的下一个大小(fast):0x00000…”

我认为“extend”函数中存在错误

void扩展(int*V,int n,int s)
{
int*pt;
pt=realloc(V,n*sizeof(int));
int i;
pt[5]=s;

对于(i=6;i井,在函数
extend
中:

  • 您正在将
    pt
    分配给
    n
    条目的内存块
  • 您正试图在
    n-1
更具体地说,包括:

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

对于(i=6;i该函数不会更改原始变量
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; 
    }
}
考虑到函数是不安全的,因为通常
n
可以小于或等于5

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

此外,这个神奇数字5的使用不清楚,也没有意义。

realloc返回指向新内存块的指针,但您不会将其返回给调用者。相反,main中的v与调用之前的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);
int*extend(int*V,int-n,int-s)
{
int*pt;
pt=realloc(V,n*sizeof(int));
int i;
pt[5]=s;

对于(i=6;i像这样增长一个数组

  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倍,倍增太过激进,而且
每次调用时重新分配都太贵了。

您的答案是正确的,这解决了问题,但现在我知道为什么输出是正确的了?@user4789408:我不理解“现在我知道为什么输出是正确的”…这是个问题吗???如果我对pt[n],pt[n+1]执行非法内存访问操作为什么在Main的末尾输出是正确的?这是未定义的行为。未定义实际上意味着任何事情都可能发生。甚至打印您的预期结果也可能发生。并非每次访问非法内存位置都会导致分段错误。我有一个5个元素的数组,“n”是一个数字,扩展函数应该添加其他“n”元素到包含5个元素的数组中。例如:array[5],n=3->array[8]@user4789408函数分配n个元素,但在循环中使用了n+5个元素。@user4789408如果要扩展到8个元素,必须将n=8传递给函数,而不是n=3。
realloc()
获取新的大小。而不是增量大小。我修改了代码,现在使用“realloc(V,(5+n)*sizeof(int)),应该可以了吧?@user4789408这是个坏主意,因为现在你强迫其他人修改他们的答案。
    pt = realloc(*V, ( n + 5 )*sizeof(int));
                     ^^^^^^^^
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);
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);
  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;
   }