C语言 整型数组的Malloc和Realloc



我刚刚开始学习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);
}

最新更新