我正在阅读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作为答案。为什么会这样?
答案 0 :(得分:8)
因为int array[]
只是一个指针而且它的大小与int
相同。
我认为你期望arr
的大小会以某种方式传递给函数,但它不会那样工作。 arr
的大小只能在声明它的同一范围内确定,因为sizeof
实际上在编译时有效。
答案 1 :(得分:6)
数组作为指针传递。该函数无法知道为阵列分配了多少空间。
答案 2 :(得分:3)
所有数组在传递时都会衰减为指针,因此表达式变为:
sizeof(void*)/sizeof(int)
相当于32位机器上的1位,32位int
s,2位64位机器,32位int
s。
答案 3 :(得分:2)
您需要将长度传递给函数,或者创建一个包含指向数组的指针和数组长度的结构。 C阵列没有存储大小信息。
答案 4 :(得分:1)
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语言中,数组是特殊的,因为它们不能作为函数参数传递或从函数返回,因此当您期望数组时,您将经常看到指针。调用者(你!)有责任提供足够的信息将指针正确地解释为数组。
请注意,一个常见的C语言完全动态创建一个“数组”,而没有提到数组类型:char * p = malloc(10);
这里p
绝不是指针,而是完全由你来记住您可以将其视为一个数组。
(在C ++中情况稍好一些,您可以通过引用传递实际数组。)
答案 5 :(得分:0)
请参阅函数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个字节