我刚刚开始学习malloc()
和realloc()
,在测试它们时,我遇到了重新分配int数组大小的问题。
程序应该创建一个数组,最初大小为2,但应该增加其大小并向其添加10次值。然而,它没有增加它的大小,输出最终是array = {0,1}
,而应该是array = {0,1,2,3,4,5,6,7,8,9}
#include <stdlib.h>
#include <stdio.h>
int main(void) {
int *array= malloc(sizeof(int)*2);
for (int x = 0; x < 10; x++) {
array = realloc(array, sizeof(int)*(2+x));
array[x] = x;
}
for (int i = 0; i<(sizeof(array)/sizeof(array[0])); i++) {
printf("%dn",array[i]);
}
free(array);
}
谁能解释一下为什么它不起作用?我试着寻找答案,但这对我来说都没有意义,哈哈。
表达式
sizeof(array)/sizeof(array[0])
等价于
sizeof( int * )/sizeof( int )
并根据所使用的系统产生2或1。
表达式(2+x)
在这个语句
array = realloc(array, sizeof(int)*(2+x));
在for循环的每次迭代中使用是没有意义的。
你的意思好像是这样的
enum { N = 10 };
size_t n = 2;
int *array = malloc( n * sizeof( int ) );
for ( int x = 0; x < N; x++ ) {
if ( n <= x )
{
n += 2;
array = realloc( array, n * sizeof( int ) );
}
array[x] = x;
}
for ( int i = 0; i < N; i++ ) {
printf("%dn",array[i]);
}
free(array);
一般来说,在调用realloc
时使用中间指针更安全,例如
int *tmp = realloc( array, n * sizeof( int ) );
if ( tmp != NULL ) array = tmp;
如果调用realloc
将返回空指针,则可能会丢失分配的内存。
问题是sizeof(array)
将只返回指针的大小(64位系统上为8字节)。您需要在另一个变量中跟踪数组大小。例如…
#include <stdlib.h>
#include <stdio.h>
int main(void) {
int *array= malloc(sizeof(int));
int size;
for (size = 0; size < 10; size++) {
array = realloc(array, sizeof(int)*(1+size));
array[size] = size;
}
for (int i = 0; i<size; i++) {
printf("%dn",array[i]);
}
printf("array size: %ldn",size*sizeof(int));
free(array);
}