数组长度问题

时间:2011-09-09 10:23:21

标签: c sizeof

我正在阅读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作为答案。为什么会这样?

6 个答案:

答案 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个字节

相关问题