C语言传递int数组给函数时出现元素间插入0的问题排查
指针数组误用导致的数组传递异常问题
核心问题根源
你定义的int *arr[5]是指针数组(每个元素都是int*类型),而非你实际需要的普通int数组,这是所有异常的源头。
异常原因拆解
main函数中打印正常的假象
在main里直接打印指针数组元素时,你用整数初始化指针(属于不规范的隐式类型转换),printf用%d输出时,会把指针的数值(也就是你初始化的2、1等)直接当作整数打印,所以看起来结果符合预期。aprint函数中输出异常的本质
当你把指针数组arr传递给aprint的int* arr参数时,原数组名会被隐式转换为指向第一个元素的指针(即int**类型),但你用int*去接收,相当于把int**当作int*来操作。
在64位系统中,指针占8字节,而int占4字节。当你在aprint里访问arr[i]时,会把每个8字节的指针值拆成两个4字节的int读取:
- 第一个指针元素值为2,64位存储为
0x0000000000000002,拆成两个int就是2和0; - 第二个指针元素值为1,拆成1和0,以此类推。
这就是为什么扩展循环到2n时,会出现原数字被0穿插的输出。
修正方案
把数组定义改为普通int数组即可:
int arr[5] = {2, 1, 3, 5, 4};
此时数组名传递给aprint的int*参数完全匹配,数组名会隐式转换为指向第一个int元素的指针,访问arr[i]就是正确的数组元素值。
修正后完整代码
#include<stdio.h> void aprint(int* arr, int n){ int i; printf("calling aprint():\n"); for (i = 0; i < n; i++){ printf("%d, ", arr[i]); } printf("\n"); } int main(void){ int i; int arr[5] = {2, 1, 3, 5, 4}; int n = sizeof(arr)/sizeof(arr[0]); printf("in main():\n"); for (i = 0; i < n; i++){ printf("%d, ", arr[i]); } printf("\n"); aprint(arr, n); return 0; }
运行后就能得到你期望的输出结果。
内容的提问来源于stack exchange,提问作者YWH
相关产品推荐
相关产品推荐

