C 代码的结果是什么?

C 代码的结果是什么?,c,arrays,C,Arrays,请为我解释以下代码运行的结果 #include <stdio.h> int get_array_size(int *arr){ return sizeof(arr)/sizeof(int); } int main(int argc, char const *argv[]){ int arr[10]; printf("%d\n", sizeof(arr)/sizeof(int)); printf("%d\n",get_array_size(arr))

请为我解释以下代码运行的结果

#include <stdio.h>

int get_array_size(int *arr){
    return sizeof(arr)/sizeof(int);
}

int main(int argc, char const *argv[]){
    int arr[10];
    printf("%d\n", sizeof(arr)/sizeof(int));
    printf("%d\n",get_array_size(arr));
    printf("%d\n",arr[10]);
    printf("%d\n",get_array_size(arr));
    return 0;
}

所有大小均以字节为单位

sizeof(arr)/sizeof(int) = size of array / size of int = 40/4 = 10 

get_array_size(arr) = size of array pointer(which is 4) / size of int = 4/4 = 1. 

arr[10] = the eleventh entry of array(array size=10). (undefined number).

所有大小均以字节为单位

sizeof(arr)/sizeof(int) = size of array / size of int = 40/4 = 10 

get_array_size(arr) = size of array pointer(which is 4) / size of int = 4/4 = 1. 

arr[10] = the eleventh entry of array(array size=10). (undefined number).
#包括
int获取数组大小(int*arr){
返回sizeof(arr)/sizeof(int);
}
int main(int argc,char const*argv[]{
int-arr[10];
printf(“%d\n”,sizeof(arr)/sizeof(int));//10
printf(“%d\n”,获取数组大小(arr));//1
printf(“%d\n”,arr[10]);//如果[9]地址=x,则[10]从x+4地址打印未定义的值
printf(“%d\n”,获取数组大小(arr));1
返回0;
}
调用函数时,局部变量arr被赋予优先级,因此调用时4/4始终为1
printf("%d\n", sizeof(arr)/sizeof(int));
int获取数组大小(int*arr){ 返回sizeof(arr)/sizeof(int); } int main(int argc,char const*argv[]{ int-arr[10]; printf(“%d\n”,sizeof(arr)/sizeof(int));//10 printf(“%d\n”,获取数组大小(arr));//1 printf(“%d\n”,arr[10]);//如果[9]地址=x,则[10]从x+4地址打印未定义的值 printf(“%d\n”,获取数组大小(arr));1 返回0; } 调用函数时,局部变量
arr
具有优先级,因此调用时4/4始终为1

printf("%d\n", sizeof(arr)/sizeof(int));
sizeof(arr)返回数组的大小(以字节为单位)。由于它是长度为10的整数数组,“sizeof(arr)”将是“10*sizeof(int)”。您正在按sizeof(int)进行划分。因此,输出将为10

printf("%d\n",get_array_size(arr));
printf("%d\n",arr[10]);
printf("%d\n",get_array_size(arr));
这很有趣! 您正在传递地址“arr”以获取数组大小()。在这个函数中,您首先得到地址的大小。地址大小取决于您正在运行的机器,即在32位机器中,地址大小为4字节,在64位机器中,地址大小为8字节。我认为您使用的是64位机器,所以sizeof(arr)返回8。但是sizeof(int)是4字节。因此,它实际上是8/4=2

printf("%d\n",get_array_size(arr));
printf("%d\n",arr[10]);
printf("%d\n",get_array_size(arr));
您的数组大小为10,因此您可以从arr[0]访问到arr[9]。arr[10]不是阵列的一部分。该地址可能用于其他变量。你只是在写那个地址上的任何东西。输出是完全随机的。我认为当你执行程序时,地址是0,所以你得到的输出是0

printf("%d\n",get_array_size(arr));
printf("%d\n",arr[10]);
printf("%d\n",get_array_size(arr));
这是重复打印(输出为2

sizeof(arr)返回数组的大小(以字节为单位)。由于它是长度为10的整数数组,“sizeof(arr)”将是“10*sizeof(int)”。您正在按sizeof(int)进行划分。因此,输出将为10

printf("%d\n",get_array_size(arr));
printf("%d\n",arr[10]);
printf("%d\n",get_array_size(arr));
这很有趣! 您正在传递地址“arr”以获取数组大小()。在这个函数中,您首先得到地址的大小。地址大小取决于您正在运行的机器,即在32位机器中,地址大小为4字节,在64位机器中,地址大小为8字节。我认为您使用的是64位机器,所以sizeof(arr)返回8。但是sizeof(int)是4字节。因此,它实际上是8/4=2

printf("%d\n",get_array_size(arr));
printf("%d\n",arr[10]);
printf("%d\n",get_array_size(arr));
您的数组大小为10,因此您可以从arr[0]访问到arr[9]。arr[10]不是阵列的一部分。该地址可能用于其他变量。你只是在写那个地址上的任何东西。输出是完全随机的。我认为当你执行程序时,地址是0,所以你得到的输出是0

printf("%d\n",get_array_size(arr));
printf("%d\n",arr[10]);
printf("%d\n",get_array_size(arr));

这是重复打印(输出为2)。

arr是数组的入口地址,为什么sizeof(arr)是40?sizeof(arr)给出了数组的完整大小,即40字节。只要编译器知道arr实际上是什么,它就给出了整个对象的大小,但是当arr被传递时,它总是衰减成一个指针。好的,我得到了。arr是数组的入口地址,为什么sizeof(arr)是40?sizeof(arr)给出了数组的完整大小,即40字节。每当编译器知道arr实际上是什么时,它给出了整个对象的大小,但当arr被传递时,它总是衰减为指针。