You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言传递int数组给函数时出现元素间插入0的问题排查

指针数组误用导致的数组传递异常问题

核心问题根源

你定义的int *arr[5]是指针数组(每个元素都是int*类型),而非你实际需要的普通int数组,这是所有异常的源头。

异常原因拆解

  1. main函数中打印正常的假象
    在main里直接打印指针数组元素时,你用整数初始化指针(属于不规范的隐式类型转换),printf用%d输出时,会把指针的数值(也就是你初始化的2、1等)直接当作整数打印,所以看起来结果符合预期。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 19:48:30