我有一个要在运行时增加大小的数组。我通过使用循环将值分配给数组的元素,当循环的索引达到数组的元素数时,我想增加数组的大小。
我所做的实际上有效;我可以为数组的元素分配值,而通常情况下,如果不增加数组的大小,我将无法为其分配任何值。不好的一面是,程序运行顺利完成后,它使我崩溃了。怎么了 是否可能是我尝试分配给该数组的内存已满?
int main()
{
int arr[3];
int num_of_elements = sizeof(arr)/sizeof(arr[0]); // This gives '3', I checked
for(i = 0; i < 10; i++)
{
if(i == num_of_elements)
{
num_of_elements = num_of_elements + 10;
realloc(arr, num_of_elements);
}
arr[i] = i+10;
printf("%d\n", arr[i]);
}
return 0;
}
好吧,您正在调用未定义的行为。根据标准§7.22.3.5
void *realloc(void *ptr, size_t size);
如果ptr是空指针,则realloc函数的行为类似于
malloc
指定大小的函数。否则,如果ptr
与内存管理函数先前返回的指针不匹配,或者如果通过调用free或realloc
function释放了空间,则该行为是不确定的。如果无法分配用于新对象的内存,则不会释放旧对象,并且其值不变。
通过内存管理功能-意味着malloc
等arr
不是动态分配的内存。因此,将其传递给realloc
未定义的行为-在这种情况下,该行为会导致您在程序中崩溃。
如果这样做,那会起作用
int *arr = malloc(sizeof(int)*3);
if( arr == NULL){
perror("Malloc failed");
exit(EXIT_FAILURE);
}
...
int *p = realloc(arr,num_of_elements*sizeof(int));
^^^^^
if(p == NULL ){
perror("realloc failed");
exit(EXIT_FAILURE);
}
arr = p;
检查如何realloc
使用。
外卖将是:
realloc
,malloc
。10*sizeof(int)
内存的额外10个元素。arr = realloc(arr,SIZE)
万一realloc
失败,请不要做,否则会导致内存泄漏。realloc
要p
毕竟你做arr=p
annyway?到目前为止有两个原因
答案是realloc
失败时返回,NULL
如果您分配arr
给它,则返回现在,NULL
那么您可能会遇到丢失对先前分配的内存的唯一引用的情况,从而导致内存泄漏。这就是我们这样做的原因。
从标准上注意这一点
该
realloc
函数返回指向新对象的指针(该值可能与指向旧对象的指针的值相同),或者如果无法分配新对象,则返回null指针。
请注意,该may
部分-可能与之前指出的地址相同,arr
也可能不同。这就解释了为什么我们应该将其存储在一些临时指针中,然后再进行分配。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句