sizeof和数组名的问题

cimil 2007-01-25 08:54:44
sizeof运算符和数组名的问题

先看代码:

#include <iostream>

using namespace std;

void theFun(char a[])
{
cout<<"2:"<<sizeof(a)<<endl;
}

int main()
{
char a[100]="";

cout<<"1:"<<sizeof(a)<<endl;

theFun(a);

return 0;
}

程序的输出结果为:
1:100
2:4


我的问题:为什么两次输出结果不一样?
...全文
2944 56 打赏 收藏 转发到动态 举报
写回复
用AI写文章
56 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lenny_he 2012-08-14
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 的回复:]

还没有结贴吗?

这是编译器行为,

一般情况下sizeof会返回数组所占用的空间,这在编译期间解析得到,编程一个常量。
函数调用因为发生在运行期间,这时编译器无法在编译期间决定数组(实参给形参表示的数组不定)的大小,不能在编译时将其转换为常数,故只能将之退化为运行期间可以处理的指针。

记住一点,sizeof运算符只在编译期间可见,编译结束后就没有sizeof行为了,都变为常数了……
[/Quote]

同意32楼的说法,很好理解。。。。
苍原狮啸 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 的回复:]

char a[100]= " ";
cout < < "1: " < <sizeof(a) < <endl;
显示数组a的大小

theFun(a); //将a的头指针传递给theFun函数.

在里面计算的只是a的头指针
[/Quote]
字符型指针地址不是才占8位,也就是一个字节吗?
  • 打赏
  • 举报
回复
这是MSDN里面的原文
最后一段里面有说到这个问题,这里我翻译一下(不准确的地方请多多指教):
当应用于静态数组时,sizeof 返回整个数组的大小。sizeof操作符不能返回动态分配的数组或外部阵列的大小。

所以1:100 这里返回的是整个数组的大小。
2:4 上面已经说了,是数组名退化为指针了。

希望对这个问题的理解会有帮助。
  • 打赏
  • 举报
回复
sizeof Operator
sizeof expression

The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t.

The expression is either an identifier or a type-cast expression (a type specifier enclosed in parentheses).

When applied to a structure type or variable, sizeof returns the actual size, which may include padding bytes inserted for alignment. When applied to a statically dimensioned array, sizeof returns the size of the entire array. The sizeof operator cannot return the size of dynamically allocated arrays or external arrays.
cimil 2007-01-31
  • 打赏
  • 举报
回复
limaolinghu(我是赶上大规模的散分运动才升的级) ( ) 信誉:100 Blog 2007-1-30 8:53:42 得分: 0

晕,回答这么多了。
我觉得搂住现在的问题是,同样一个指针为什么编译器在函数调用前和调用后对他的解释有区别,这种区别是对原有指针作了标记还是编译器函数调用时所作的规定性的处理?

---------------------------------------------------
我学艺不精,还是你把我的问题表述得比较清楚。
hsf1002 2007-01-31
  • 打赏
  • 举报
回复
不知道你有没有明白;
你程序中的第一个 sizeof(a) 中的 a 被定义为一个数组;
第二个 sizeof(a) 中的 a 是个参数,会转化成常量指针;
hsf1002 2007-01-31
  • 打赏
  • 举报
回复
似乎也只有在 sizeof 运算符里数组名表示整个数组, 其它情况下都是该数组首元素的地址;
特别式当数组名作为函数参数时会转化为数组首元素的指针;
user_csc 2007-01-31
  • 打赏
  • 举报
回复
在函数中参数相当于指针(指针大小与系统有关,32位是4 ),所以输出是4 ,前面一个当然是数组的大小哦!!!
clxye 2007-01-31
  • 打赏
  • 举报
回复
呵呵,判断对了,有进步。
doubhor 2007-01-31
  • 打赏
  • 举报
回复
还没有结贴吗?

这是编译器行为,

一般情况下sizeof会返回数组所占用的空间,这在编译期间解析得到,编程一个常量。
函数调用因为发生在运行期间,这时编译器无法在编译期间决定数组(实参给形参表示的数组不定)的大小,不能在编译时将其转换为常数,故只能将之退化为运行期间可以处理的指针。

记住一点,sizeof运算符只在编译期间可见,编译结束后就没有sizeof行为了,都变为常数了(例如对形参数组做sizeof等于对指针做sizeof,变为4)。
limaolinghu 2007-01-30
  • 打赏
  • 举报
回复
晕,回答这么多了。
我觉得搂住现在的问题是,同样一个指针为什么编译器在函数调用前和调用后对他的解释有区别,这种区别是对原有指针作了标记还是编译器函数调用时所作的规定性的处理?
heliboy110 2007-01-30
  • 打赏
  • 举报
回复
高清楚类型就是了
jiuweifox 2007-01-30
  • 打赏
  • 举报
回复
参数传递时发生变化了 a变成普通指针 因为子函数不知道你的数组的大小
hungerfool 2007-01-30
  • 打赏
  • 举报
回复
void theFun(char a[]),如此调用,数组名退化为普通指针,sizeof后的值等同于sizeof(int),故为4
superacmilan 2007-01-30
  • 打赏
  • 举报
回复
第一个在主函数中SIZEOF()显示的是本身这个字符数组的大小,而第二个是显示的指针的大小,数组作为参数代入函数是作为指针来替代的.
FingerStyle 2007-01-29
  • 打赏
  • 举报
回复
void theFun(char a[])
{
cout<<"2:"<<sizeof(a)<<endl;
}
可以理解为
void theFun(char* a)
{
cout<<"2:"<<sizeof(a)<<endl;
}

指针大小的当然为4了..
stars_625 2007-01-29
  • 打赏
  • 举报
回复
数组传递的时候,
需要传递一个数组长度 len 参数用来控制指针操作数组的时候不会越界 ~
zx_hxp_jw 2007-01-29
  • 打赏
  • 举报
回复
很简单啦
在函数中的数组实际上不是传递的数组而是传递的一个指针地址
所以
void theFun(char a[])
{
cout<<"2:"<<sizeof(a)<<endl;
}
实际上型参是一个指针,而所有指针的大小都是4 既sizeof(a)等于4

而直接定义数组后再测试数组的大小时就不一样了
他是得到定义的数组的大小
所以
char a[100]="";
cout<<"1:"<<sizeof(a)<<endl;
得到了数组大小100 * sizeof(char)
这里就很好的解释了为什么用数组作为函数参数时一般都要加另一个数组大小作为另一个参数的原因, 因为数组作为函数参数大小是不会知道的
stephens00 2007-01-29
  • 打赏
  • 举报
回复
C++里指针的类型是long int型的,传递的时候只是把首地址传递过去,传址调用,所以就是相当于sizeof(long int)
双杯献酒 2007-01-28
  • 打赏
  • 举报
回复
如果传递数组,函数将不能知道数组的大小.
如果数组大小固定,可以传递数组引用(C++)

#include "stdafx.h"

int GetDimSize(int (&data)[100] )
{
return sizeof(data);
}

int _tmain(int argc, _TCHAR* argv[])
{
int x[100] = {0};
int size = GetDimSize(x); // size == 400
return 0;
}
加载更多回复(36)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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