c中的数组大小

yot*_*moo 18 c arrays size

一个让我烦恼的简单问题.假设我在main中定义了一个数组,就像这样int arr[5].现在,如果我仍然在main中并且我设置int i = sizeof(arr)/sizeof(arr[0])然后我被设置为5,但是如果我将数组作为函数参数传递并在此函数中执行完全相同的计算,则得到不同的数字.这是为什么?起初我认为它是因为在一个函数中arr是一个指针,但据我所知,它arr也是一个指针在主内部!

另外,如果我做一些非常相似的事情,我只是动态地初始化数组,我得到了奇怪的结果:

int *arr = (int*) malloc(sizeof(int) * 5);
int length = sizeof(*arr) / sizeof(arr[0]);
printf("%d\n",length);
Run Code Online (Sandbox Code Playgroud)

这里的输出是1.有什么想法吗?提前致谢!

Sta*_*ven 22

C数组不会在任何地方存储它们自己的大小,因此sizeof只有在编译时知道大小时才能按预期方式工作.malloc()由编译器将其视为任何其他函数,因此sizeof无法将该arr点指向数组的第一个元素,更不用说它有多大了.如果您需要知道数组的大小,则需要将其显式传递给函数,作为单独的参数,或者使用包含指向数组及其大小的指针的结构.

  • ...或者通过在数组中存储sentinel值,或者使用隐含长度的数组元素的某些属性.... (5认同)

use*_*019 6

这是因为arr现在是一个指针,它可以指向单个int或函数只是不知道的1000个int的数组.您必须将数组的大小传递给函数.

在main arr中声明为int [5],因此大小可以由编译器计算.


pae*_*bal 5

我不明白第一个问题(请发一些代码),但对于第二个问题:

sizeof(*arr) ;   // is sizeof(int) as arr is of type "int *"
sizeof(arr[0]) ; // is sizeof(int), as arr[0] is the first
                 //     item of an array of int
Run Code Online (Sandbox Code Playgroud)

事实是,*arr并且arr[0]意思完全相同,但说的不同.实际上,假设n是一个索引:*(arr + n)是相同的arr[n].