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
相关产品推荐
相关产品推荐

