传递时C int数组收缩
我将一个包含4个元素的传递时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]));
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()
中使用的相同的未知全局变量。如果他们打印出不同的结果,这将是一个谜。