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

C语言数组传入其他函数后丢失最后一个元素的原因及解决方法

问题根因

你遇到的问题是C语言的经典特性:数组作为函数参数传递时会退化为指针,丢失原数组的长度信息。

  • 在makearray函数内部,arr的类型是static int[3],属于完整的数组类型:sizeof(arr)得到的是整个数组的总字节数(3个int共12字节,假设int占4字节),除以单个元素的大小sizeof(arr[0])(4字节),得到的长度是3,所以打印正常。
  • 数组传入printArray后,参数被处理为int*类型的指针:在64位系统下指针本身占8字节,sizeof(arr)/sizeof(arr[0])计算结果为8/4=2,所以循环只会执行2次,只能打印前两个元素。如果是32位系统,指针占4字节,计算结果会是1,只能打印第一个元素。

修复方案

最通用的解决方法是:传递数组的同时额外传递数组长度参数,不要在接收指针的函数内部计算数组长度。

修正后的代码如下:

#include <stdio.h>

// 新增长度参数n
void printArray(int* arr, size_t n){
  for(int i=0; i<n; i++){
    printf("%d\n",arr[i]);
  }
}

int* makearray()
{
        static int arr[3];
        arr[0] = 1;
        arr[1] = 2;
        arr[2] = 3;

        printf("The Array before passing onto stack\n");
        size_t n = sizeof(arr)/sizeof(arr[0]);
        for(int i=0; i<n; i++){ printf("%d\n",arr[i]);}

        printf("\nThe Array when attempting to pass to another function\n");
        // 调用时传入计算好的长度
        printArray(arr, n);
        return arr;
}
int main(void) {
  int* m = makearray();
  return 0;
}

如果你的数组长度是固定的,也可以选择把数组封装进结构体传递,或者直接传递固定长度的数组指针,但传递长度参数的兼容性最高,适用于所有场景。

内容的提问来源于stack exchange,提问作者mhluo132

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:24:00