2013-02-23 54 views
0

我传递一个数组int与4个元素到一个函数和sizeof(array)/sizeof(array[0])说我有更少的元素。诠释int数组通过收缩

这里的例子发生的事情的:

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])); 
} 
+0

与所有的编辑,我想知道(一) (*)*原始*问题发生了什么,(b)'matrix_transposition_key'声明在哪里?原来的问题在'function()'的printf中使用'array []',这不会,甚至不会编译。 – WhozCraig 2013-02-23 22:00:15

+1

您不能将数组传递给函数或从函数返回它们;他们降级到指向他们的第一个元素。 – 2013-02-23 22:02:33

+0

对不起,重写了一些代码来泛化和复制/粘贴printf语句。我会编辑修复 – 2013-02-23 22:09:26

回答

4

这里的问题是函数参数是数组被编译器转换成指针。所以,这是因为如果你的函数有签名

void function(int *array); 

这意味着两件事情:

  1. 你必须明确地传递数组的大小作为另一个参数,既然已经“丢失”。
  2. sizeof(array)只会告诉你指针在你的架构中的大小。所以通过你的输出,我们可以知道你正在编译一个64位的目标,但没有别的。

注意sizeof(array[0])相当于sizeof(*array)(指针运算),所以它还是会给予正确的值不管是什么。

+0

谢谢,我会通过大小作为参数。 – 2013-02-23 22:03:23

+0

还要注意,虽然这很可能是问题,但是发布的代码在它的'printf()'中不会使用该参数;它使用'main()'中使用的未知全局。如果他们打印出不同的结果,那么*会是一个谜。 – WhozCraig 2013-02-23 22:04:42

1

函数内部的的sizeof返回的sizeof指向您的阵列可以是取决于你的系统4或8。

+0

或2,如果你在一个16位系统:) – SecurityMatt 2013-02-23 22:00:17

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