首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >以c为单位的数组大小

以c为单位的数组大小
EN

Stack Overflow用户
提问于 2011-09-25 20:17:23
回答 5查看 23K关注 0票数 18

一个困扰我的简单问题。假设我在main中定义了一个数组,比如int arr[5]。现在,如果我仍然在main中,并且我设置了int i = sizeof(arr)/sizeof(arr[0]),那么我被设置为5,但是如果我将数组作为函数参数传递,并在这个函数中进行完全相同的计算,我会得到一个不同的数字。为什么会这样呢?起初我认为这是因为在函数中arr是一个指针,但据我所知arr也是主函数中的一个指针!

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

代码语言:javascript
复制
int *arr = (int*) malloc(sizeof(int) * 5);
int length = sizeof(*arr) / sizeof(arr[0]);
printf("%d\n",length);

这里的输出是1。你知道为什么吗?提前感谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-09-25 20:26:30

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

票数 23
EN

Stack Overflow用户

发布于 2011-09-25 20:22:28

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

在main中,arr被声明为int5,因此其大小可以由编译器计算。

票数 6
EN

Stack Overflow用户

发布于 2011-09-25 20:26:58

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

代码语言:javascript
复制
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

事实是,*arrarr[0]的意思完全相同,但表达方式不同。实际上,假设n是一个索引:*(arr + n)arr[n]相同。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7545428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档