使用函数增加动态数组大小;免费错误,下一个尺寸无效(快速)
Increase dynamic array size with a function; free error, invalid next size (fast)
我需要创建一个动态数组并放入五个数字,之后还有另一个输入是我必须增加多少数组大小。
当所有输入结束后,我将增加数组大小并在其中放入数字。
一切正常,但没有 return 我这个错误:"free(): invalid next size (fast): 0x00000..."
我认为"extend"函数内部有错误
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;
}
嗯,在函数中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]
函数不改变原变量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 的使用也不清楚,没有意义。
realloc return 是指向新内存块的指针,但您不会 return 将其指向调用者。相反,main 中的 v 与调用之前的 v 相同,但现在无效,这无疑会导致您的错误,最简单的方法是 return 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);
像这样增长数组
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;
}
你需要临时文件因为 realloc returns 0 失败但保持
参数完好无损,所以你需要保留数组来销毁它
优雅地。增长约 1.5,翻倍过于激进,
在每次调用时重新分配成本太高。
我需要创建一个动态数组并放入五个数字,之后还有另一个输入是我必须增加多少数组大小。 当所有输入结束后,我将增加数组大小并在其中放入数字。
一切正常,但没有 return 我这个错误:"free(): invalid next size (fast): 0x00000..."
我认为"extend"函数内部有错误
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;
}
嗯,在函数中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]
函数不改变原变量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 的使用也不清楚,没有意义。
realloc return 是指向新内存块的指针,但您不会 return 将其指向调用者。相反,main 中的 v 与调用之前的 v 相同,但现在无效,这无疑会导致您的错误,最简单的方法是 return 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);
像这样增长数组
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;
}
你需要临时文件因为 realloc returns 0 失败但保持 参数完好无损,所以你需要保留数组来销毁它 优雅地。增长约 1.5,翻倍过于激进, 在每次调用时重新分配成本太高。