C语言数组在不同上下文的大小计算差异问题求助
为什么数组传入函数后用sizeof计算的长度和声明时不一样?
核心原因:数组传参时会退化为指针
C语言规定,数组作为函数参数传递时,会自动转换为指向数组首元素的指针——函数无法直接接收整个数组作为参数,只能接收指针类型。
两种场景的差异解析
main函数中的计算
在main里,a是明确的数组类型(int[12]),sizeof(a)计算的是整个数组占用的字节数(12个int,若每个int占4字节则为48字节)。除以sizeof(int)(4字节),自然得到元素个数12。createLL函数中的计算
函数参数int* arr本质是一个指针变量,sizeof(arr)得到的是当前系统下指针类型的字节数:- 64位系统中指针占8字节,
8 / 4 = 2,这就是你看到输出2的原因; - 若在32位系统中,指针占4字节,结果会是1。
不管原数组实际长度多大,函数里的arr都是指针,所以这个计算结果只和系统位数有关,和数组本身无关。
- 64位系统中指针占8字节,
解决办法
要在函数里正确获取数组长度,最稳妥的方式是额外传入数组长度参数:
修改后的代码示例:
LLNode* createLL(int* arr, int len) { printf("%d ", len); // 直接使用传入的长度 LLNode* head=(LLNode *)malloc(sizeof(LLNode)); head->data = arr[0]; head->next = NULL; int i=0; for(i=1; i<len; i++) { insertNode(head, arr[i]); } return head; } int main() { int a[12] = {5,5,55,6,1,5,5,48,5,4,8}; int arr_len = sizeof(a)/sizeof(int); printf("%d ", arr_len); LLNode* head = createLL(a, arr_len); // insertNode(head, 87); // printLL(head); return 0; }
你也可以使用C99支持的变长数组(VLA),把函数参数写成LLNode* createLL(int len, int arr[len]),这样函数里sizeof(arr)能计算整个数组的字节数,但VLA有使用限制(比如不能用于静态变量初始化),所以多数场景下还是推荐传长度参数的方式。
内容的提问来源于stack exchange,提问作者Hemanth
相关产品推荐
相关产品推荐

