数组长度问题

我正在阅读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个字节