C int数组在传递时收缩

时间:2013-02-23 21:55:57

标签: c arrays function

我将一个包含4个元素的int数组传递给一个函数,sizeof(array)/sizeof(array[0])表示我的元素较少。

以下是正在发生的事情的例子:

int
main() {
  // declaring literal array
  int array[] = {1,2,3,5};

  // prints 16/4 (correct output for 4 elements)
  printf("%d/%d\n", sizeof(array), sizeof(array[0]));

  function(array);

  return 0;
}

void
function(int array[]) {
  // printing 8/4 instead of 16/4
  printf("%d/%d\n", sizeof(array), sizeof(array[0]));
}

3 个答案:

答案 0 :(得分:4)

这里的问题是数组的函数参数被编译器转换为指针。所以就好像你的函数有签名

void function(int *array);

这意味着两件事:

  1. 您必须明确地将数组的大小作为另一个参数传递,因为它已经“丢失”。
  2. sizeof(array)只会告诉您架构中指针的大小。因此,根据您的输出,我们可以告诉您正在编译64位目标,但没有别的。
  3. 请注意sizeof(array[0])等同于sizeof(*array)(指针算术),因此无论如何它仍将提供正确的值。

答案 1 :(得分:1)

函数内部的sizeof返回指向数组的sizeof指针,取决于你的系统,它可以是4或8。

答案 2 :(得分:1)

当您将数组作为I / P参数传递给函数时,它被视为包含其基址的指针。

你得到:sizeof(指针)/ sizeof(数组的第一个元素)

在GDB中:(在函数()内部

(gdb) pt matrix_transposition_key                                                               
type = int *                                                                                    
(gdb) pt matrix_transposition_key[0]                                                 
type = int 

(gdb) p sizeof(matrix_transposition_key)
$2 = 8                                                                                          
(gdb) p sizeof(matrix_transposition_key[0])                                                       
$3 = 4