关于C语言中realloc()函数对主函数数组内存影响的疑问
问题解答
代码展示
#include <stdio.h> #include <stdlib.h> void Increase(int *array1,int *Nums) { int*array2 = realloc(array1,(*Nums+1)*sizeof(int)); array2[*Nums] = 13; array2[*Nums-1] = 14; ++(*Nums); } int main() { int NumOfElements=0,i; int*array=(int*)malloc(0*sizeof(int)); Increase(array,&NumOfElements); for(i=0;i<NumOfElements;i++) { printf("%d ", array[i]); } free(array); }
问题解答
main()函数中的数组实际包含多少元素?
NumOfElements在Increase函数里被改成了1,main里的循环会执行1次,但这只是变量记录的“元素数”。实际上main里的array指向的还是malloc(0)分配的0大小内存块,没有有效元素,访问array[0]属于内存越界,是未定义行为(程序可能崩溃、输出乱码或出现其他异常)。Increase()函数是否会增加main()函数中数组的内存单元数量?
不会。原因是:
Increase接收的array1是main中array指针的副本,realloc返回的新内存指针array2只是函数内部的局部变量,没把这个新指针同步回main里的array。- main里的
array始终指向最初malloc(0)返回的内存块,该块大小始终是0,没有被扩容。 - 另外
Increase里的array2[*Nums-1] = 14;在*Nums初始为0时,等价于访问array2[-1],属于数组下标越界,同样是未定义行为。
内容的提问来源于stack exchange,提问作者Trương Cống Trình
相关产品推荐
相关产品推荐

