传递时C int数组收缩

传递时C int数组收缩,c,arrays,function,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]));

我将一个包含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]));
}

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

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

这里的问题是,作为数组的函数参数由编译器。这就好像你的函数有签名一样

void function(int *array);
这意味着两件事:

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

  • 请注意,
    sizeof(数组[0])
    相当于
    sizeof(*array)
    (指针算法),因此无论发生什么情况,它都会给出正确的值。

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

    void function(int *array);
    
    这意味着两件事:

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

  • 请注意,
    sizeof(array[0])
    相当于
    sizeof(*array)
    (指针算术),因此无论发生什么情况,它都将给出正确的值。

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

    您将获得:sizeof(指针)/sizeof(数组的第一个元素)

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


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

    您将获得:sizeof(指针)/sizeof(数组的第一个元素)

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


    经过所有的编辑,我想知道(a)原始问题发生了什么,(b)矩阵换位键在哪里??原始问题在
    函数()中的printf中使用了
    数组[]
    ,这不会,甚至不再编译。您不能将数组传递给函数或从函数返回数组;它们降级为指向其第一个元素的指针。抱歉,我正在重写一些代码以进行泛化,并复制/粘贴printf语句。我将编辑以修复所有编辑,我想知道(a)原始问题发生了什么,以及(b)矩阵换位键在哪里声明??原始问题在
    函数()中的printf中使用了
    数组[]
    ,这不会,甚至不再编译。您不能将数组传递给函数或从函数返回数组;它们降级为指向其第一个元素的指针。抱歉,我正在重写一些代码以进行泛化,并复制/粘贴printf语句。如果您在16位系统上,我将编辑为fixOr 2:)或者如果您在16位系统上,我将编辑为fixOr 2:)谢谢,我将把大小作为参数传递。另外请注意,虽然这很可能是问题所在,但发布的代码在其
    printf()
    中没有使用参数;它使用与
    main()
    中使用的相同的未知全局变量。现在,如果他们打印不同的结果,这将是一个谜。谢谢,我将把大小作为参数传递。还要注意,虽然这很可能是问题所在,但发布的代码在其
    printf()
    中没有使用参数;它使用与
    main()
    中使用的相同的未知全局变量。如果他们打印出不同的结果,这将是一个谜。