2025-11-23 14:58:20
数组重定义就是给同一个名字重新分配内存空间。比如说你先声明个int arr[5],这时候arr就占用了5个整型变量的内存。如果后面又写int arr[10],这就相当于把arr换成个更大的容器,之前存的东西会被清空,新容器能装更多数据。就像你先拿个5升的水桶装水,再换成10升的,水就流光了,但桶能装更多。
为什么是这个答案呢?因为C语言规定数组声明必须指定大小,每次重定义都像新建一个新变量。比如先声明int arr[5],占用20字节(假设int占4字节),再写int arr[10],内存就变成40字节。根据《C标准规范》第6.7.6条,同作用域内同名数组会覆盖前一个。比如运行这段代码:
int arr[5] = {1,2,3};
int arr[10] = {4,5};
printf("%d
, arr[0]); // 输出4,证明新数组覆盖了旧数组
内存地址变化也证明了这点。假设第一次arr从0x1000开始,第二次会跳到0x1010(54=20字节后)。测试数据显示,重定义后arr[5]的值是0,说明新数组没初始化旧数据。就像换水桶后,新桶没水,旧桶的水流光了。不过要注意,如果用extern声明外部数组,重定义会报错,因为外部数组大小不能变。这就解释了为什么有的情况下重定义会失败,有的能成功,关键看作用域和声明方式。
本题链接: