通过指针计算c中的数组长度,答案是错误的

时间:2016-03-29 15:33:24

标签: c arrays pointers

#include <stdio.h>
int a[3] = {1,2,3};

void cal(int* item){
    printf("Length(inside) is %lu\n", sizeof(item)/sizeof(item[0]));
}

int main(){
    printf("Length(outside) is %lu\n", sizeof(a)/sizeof(int));
    cal(a);
}

上面的代码结果是

Length(outside) is 3
Length(inside) is 2

然而,这是错误的,因为它们都应该是3,我的代码出了什么问题?

2 个答案:

答案 0 :(得分:0)

这是因为数组在传递给函数时会衰减为指针。

基本上你正在做的是

sizeof(int*)/sizeof(int);

你能想到的是

之间的区别
int a[5];
sizeof(a)/sizeof(a[0]); //this works

int a[5];
int* p = a;
sizeof(p)/sizeof(p[0]);

答案 1 :(得分:0)

首先,您应该使用%zu fomat说明符来打印结果。

其次,当作为参数传递给函数时,数组名称会衰减到指向第一个元素的指针,因此sizeof(item)将无法按预期工作。

基本上你正在做的是sizeof (int *)/ sizeof (int)并且在你的环境中,指针可能占用8个字节而int占用4,所以你得到这个结果