我对C sizeof()函数有一个简单的问题。我将一个数组传递给一个函数,在该函数内部,我想检查数组的大小。但是,无论输入数组的大小如何,在函数内部,它的大小似乎总是为4.例如:
void checkArraySize(char data[])
{
int internalSize = sizeof(data); //internalSize is reported as 4
}
void main(void)
{
char data[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
int externalSize = sizeof(data); //externalSize is reported as 8
checkArraySize(data);
}
作为代码状态中的注释,在我调用类似checkArraySize()的函数之前,我检查数组的大小,并显示8.但是,当我检查函数内部数组的大小时,它只报告为具有4个元素(无论输入数组的大小如何,它都会报告4个元素)。
通常情况下,当我看到这样的问题时,这是因为我对该主题的理解存在差距。所以,我确信我只是错过了传递数组如何工作的东西。如果没有,任何关于为什么会发生这种情况的想法?
注意:这是在PIC32上,所以我使用的是Microchip的MPLAB X IDE和XC32编译器。
答案 0 :(得分:4)
void checkArraySize(char data[])
将被翻译为
void checkArraySize(char* data)
因此,代码计算指针的大小。 4是计算机中的指针大小。 在64位系统中,它将输出8。
答案 1 :(得分:1)
数组在C和C ++中不是可复制的东西。因此,这些语言的发明者被迫将从阵列到指针的非直观的自动类型转换添加到它们的第一个元素上,以便为程序员提供一种将数组作为参数传递给函数的方法。
在这样的参数上使用sizeof运算符(不是函数)返回指针类型的大小而不是数据大小。
额外分数 sizeof运算符在编译期间扩展而非运行时。从另一方面传递Arrays到函数可以有不同的大小。所以将这样的数组转换为指针有另一种解释:sizeof无法在编译期间解析不同数组的大小。
答案 2 :(得分:1)
C中的数组总是通过引用传递。这就是为什么你每次都得到指针大小,而不是实际大小。
要在C中使用数组作为参数,您应该传递带数组的数组大小。
我将你的程序修改为工作状态:
typedef unsigned char BYTE;
void checkArraySize(BYTE data[], int sizeOfArray)
{
int internalSize = sizeOfArray;
printf("%d", internalSize );
}
void main(void)
{
BYTE data[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
int externalSize = sizeof(data)/sizeof(BYTE); //it would return number of elements in array
checkArraySize(data, externalSize);
}
通过引用传递意味着只发送数组的第一个元素的地址。如果您在函数 checkArraySize 内更改了任何内容,则此更改也会反映到原始数组中。检查上面修改过的示例。
typedef unsigned char BYTE;
void checkArraySize(BYTE data[])
{
int internalSize = sizeof(data);
printf("%d\n", internalSize );
data[3]= 0x02; //internalSize is reported as 4
}
void main(void)
{
BYTE data[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
int externalSize = sizeof(data); //externalSize is reported as 8
printf("Value before calling function: 0x%x\n",data[3]);
checkArraySize(data);
printf("Value after calling function: 0x%x\n",data[3]);
}
输出将是:
Value before calling function: 0x4
4
Value after calling function: 0x2