0

我将一个int包含 4 个元素的数组传递给一个函数,并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]));
}
4

3 回答 3

4

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

void function(int *array);

这意味着两件事:

  1. 您必须将数组的大小作为另一个参数显式传递,因为它已“丢失”。
  2. sizeof(array)只会告诉您架构中指针的大小。因此,通过您的输出,我们可以看出您正在为 64 位目标进行编译,但仅此而已。

请注意,sizeof(array[0])它等效于sizeof(*array)(指针运算),因此无论如何它仍然会给出正确的值。

于 2013-02-23T22:00:18.933 回答
1

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

于 2013-02-23T21:59:38.353 回答
1

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

你得到: sizeof(pointer)/sizeof(first element of array)

在 GDB 中:(在 function() 内部)

(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                                                                                          
于 2013-02-23T22:01:46.587 回答