数组长度问题
我正在阅读csc展示文件,其中我读了一个与c语言数组的sizeof()运算符相关的问题。 答案是别的,然后我期待它。
int DIMension(int array[]) { return sizeof(array )/ sizeof(int); } main() { int arr[10]; printf(“Array dimension is %d”, DIMension(arr)); }
这个c语言程序打印1作为答案。 为什么会这样?
因为int array[]
只是一个指针,它的大小与int
相同。 我认为你期望arr
大小会以某种方式传递给函数,但它不会那样工作。 arr
大小只能在声明它的同一范围内确定,因为sizeof
实际上在编译时工作。
数组作为指针传递。 该函数无法知道为arrays分配了多少空间。
所有数组在传递时都会衰减为指针,因此表达式变为: sizeof(void*)/sizeof(int)
,在具有32位int
的32位机器上等于1,在具有32位int
的64位机器上等于2。
您需要将长度传递给函数,或者创建一个包含指向数组的指针和数组长度的结构。 Carrays没有存储大小信息。
C中的数组是一种非常脆弱的类型。 在许多情况下,数组衰减到指向第一个元素的指针,并且将数组作为函数的参数传递就是这种情况。 看吧:
int main() { char data[10]; // sizeof(data) == 10 return call_me(data); // data is equivalent to &data[0] here! } int call_me(char x[]) // int call_me(char * x) // same thing! { // here sizeof(x) == sizeof(char *) // ... }
数组中的数组是特殊的,因为它们不能作为函数参数传递或从函数返回,所以当你期望数组时,你会经常看到指针。 调用者(你!)有责任提供足够的信息将指针正确地解释为数组。
注意,一个普通的C语言完全动态地创建一个“数组”,而没有提到数组类型: char * p = malloc(10);
这里的p
永远不是指针,完全取决于你要记住你可以把它当成一个数组。
(在C ++中情况稍好一些,您可以通过引用传递实际数组。)
请参阅函数defination的语法,可以按照以下方式编写
int DIMension(int array[]) { return sizeof(array )/ sizeof(int); } int DIMension(int *array) { return sizeof(array )/ sizeof(int); } int DIMension(int array[10]) { return sizeof(array )/ sizeof(int); }
所有这三个语句具有相同的含义,并且三者之间的共同点是参数数组,它只是指向数组的指针,总是要4个字节