一个困扰我的简单问题。假设我在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);
这里的输出是1
。你知道为什么吗?提前感谢!
发布于 2011-09-25 20:26:30
C数组不会将自己的大小存储在任何地方,所以只有在编译时知道大小的情况下,sizeof
才能按照预期的方式工作。编译器将malloc()
视为任何其他函数,因此sizeof
无法判断arr
指向数组的第一个元素,更不用说它有多大了。如果需要知道数组的大小,则需要显式地将其作为单独的参数传递给函数,或者使用包含指向数组及其大小的指针的结构。
发布于 2011-09-25 20:22:28
这是因为arr现在是一个指针,它可以指向单个int或函数不知道的1000个int数组。您必须将数组的大小传递给函数。
在main中,arr被声明为int5,因此其大小可以由编译器计算。
发布于 2011-09-25 20:26:58
我不理解第一个问题(请发布一些代码),但对于第二个问题:
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
事实是,*arr
和arr[0]
的意思完全相同,但表达方式不同。实际上,假设n是一个索引:*(arr + n)
与arr[n]
相同。
https://stackoverflow.com/questions/7545428
复制相似问题