一个数组的大小sizeof(a)在main和其他函数怎么不一样

hz251 2011-12-25 02:24:16

void foo(int* a)
{
printf("%d\n",sizeof(a));
}

int main()
{
int a[]={1,2,3,4,5,6,7,8,9};
printf("%d\n",sizeof(a));
foo(a);
}

为什么两个输出不一样
...全文
176 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccjsj1 2011-12-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 nhlbengbeng 的回复:]

int main()
{
int a[]={1,2,3,4,5,6,7,8,9};
printf("%d\n",sizeof(a));//这里的a表示整个数组,大小为36(4*9)个字节
foo(a);//这里的a是指针变量,大小为4个字节
}
[/Quote]

foo(a)是把数组a的首地址传过去了,foo中的a指向了main中a数组首地址,在foo函数内没有int a[9]这段空间。
Saleayas 2011-12-25
  • 打赏
  • 举报
回复
很遗憾的是,楼上的代码同样可以
foo(0);
蚂蚁打dota 2011-12-25
  • 打赏
  • 举报
回复
int main()
{
int a[]={1,2,3,4,5,6,7,8,9};
printf("%d\n",sizeof(a));//这里的a表示整个数组,大小为36(4*9)个字节
foo(a);//这里的a是指针变量,大小为4个字节
}
iamnobody 2011-12-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 huzheng251 的回复:]
有没有办法让他们输出一样
[/Quote]

在C语言中,如果数组大小是不确定的,那么只能增加一个参数来作为他的大小 .5楼说的都是C++特有的做法.
如果大小已经确定了:


void foo(int (*a)[9])//大小确定为9
{
printf("%d\n",sizeof(*a));//注意这里有个*
}

int main()
{
int a[]={1,2,3,4,5,6,7,8,9};
printf("%d\n",sizeof(a));
foo(&a);//传递数组的指针作为参数
}

O湛狼O 2011-12-25
  • 打赏
  • 举报
回复
没办法吧~完全退化为指针计算不出来长度了。
Saleayas 2011-12-25
  • 打赏
  • 举报
回复

void foo(int (&a)[10])
{
printf("%d\n",sizeof(a));
}


或者

template<int N>
void foo (int (&a)[N])
{
printf("%d\n",sizeof(a));
}

hz251 2011-12-25
  • 打赏
  • 举报
回复
有没有办法让他们输出一样
iamnobody 2011-12-25
  • 打赏
  • 举报
回复
数组名可以转换成首元素的指针.
你的函数声明的也是指针参数,一个指针的大小是固定的.
newfarmerchi 2011-12-25
  • 打赏
  • 举报
回复
void foo(int* a)
a传递进来是指针了
Saleayas 2011-12-25
  • 打赏
  • 举报
回复
数组退化为指针了。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧