首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

sizeof和数组名的有关问题

2012-04-01 
sizeof和数组名的问题sizeof运算符和数组名的问题先看代码:#includeiostreamusingnamespacestdvoidtheF

sizeof和数组名的问题
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


我的问题:为什么两次输出结果不一样?

[解决办法]
当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。不论数组a 的容量是多少,sizeof(a)始终等于sizeof(char *)。
[解决办法]
数组名 在传递后 退化为指针。

sizeof 数组 得到数组的大小。
sizeof 指针 得到指针的大小(而不是指针指向的数据的大小)
[解决办法]
也正是因为这个 退化,
通常,
数组传递的时候,
需要传递一个数组长度 len 参数用来控制指针操作数组的时候不会越界 ~
[解决办法]
void theFun(char a[])
{
cout < < "2: " < <sizeof(a) < <endl;
}
这里的a相当于char*,所以sizeof的结果是4。

char a[100]= " ";

cout < < "1: " < <sizeof(a) < <endl;
这里的a是数组名称,因此sizeof的结果是数组的大小。

问题的关键:执行theFun(a)的时候发生了一个类型转换。

[解决办法]
当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。不论数组a 的容量是多少,sizeof(a)始终等于sizeof(char *)。
退化
[解决办法]
char a[100]= " ";
cout < < "1: " < <sizeof(a) < <endl;
显示数组a的大小

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

在里面计算的只是a的头指针
[解决办法]
准确的说,这个东西是上下文相关的.
一旦进函数.丢失上下文.只能当地址来处理.
[解决办法]
我觉得你可以这样理解,C/C++的参数传递是传值的,于是出现这样的情况:
char a[50];
Fun(a);

函数Fun外的a地址0x0008, 内容为0x0100,然后有一附加信息表示数组长度

函数内的a地址0x0050, 内容为0x0100
这里应该可以看出来了,这里的a只是数组a内容的一个拷贝,虽然你操作的是同一个数组里的东西(因为两个*a是一样的),但你sizeof的并不是同一个东西,fun内的只是函数的参数栈中的一个普通的指针

不一定对,但可能对理解有帮助吧
[解决办法]
为什么sizeof一个数组,
回有不同的计算方法呢?
本质上在于: 作为函数参数的数组只是一个指针.
在C++中sizeof是在编译的时候计算的.
然而函数却可以在多个不同的地方调用,
sizeof如果按照实际大小计算,将没有一个确定的值,从而不能在编译的时候计算数值.

[解决办法]

在参数列表里面是不能定义数组的. (即使外表是数组,实际还是指针, 编译器会自动帮你修正)
也就是:
void theFun(char a[])
编译器自作主张帮你改成:
void tehFun(char *a )

为何不允许传递数组,这个问题我也想不明白,不过既然c++这样设计了,只有适应了.

[解决办法]
如果传递数组,函数将不能知道数组的大小.
如果数组大小固定,可以传递数组引用(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;
}
[解决办法]
很简单啦
在函数中的数组实际上不是传递的数组而是传递的一个指针地址
所以
void theFun(char a[])
{
cout < < "2: " < <sizeof(a) < <endl;
}
实际上型参是一个指针,而所有指针的大小都是4 既sizeof(a)等于4



而直接定义数组后再测试数组的大小时就不一样了
他是得到定义的数组的大小
所以
char a[100]= " ";
cout < < "1: " < <sizeof(a) < <endl;
得到了数组大小100 * sizeof(char)
这里就很好的解释了为什么用数组作为函数参数时一般都要加另一个数组大小作为另一个参数的原因, 因为数组作为函数参数大小是不会知道的
[解决办法]
晕,回答这么多了。
我觉得搂住现在的问题是,同样一个指针为什么编译器在函数调用前和调用后对他的解释有区别,这种区别是对原有指针作了标记还是编译器函数调用时所作的规定性的处理?
[解决办法]
第一个在主函数中SIZEOF()显示的是本身这个字符数组的大小,而第二个是显示的指针的大小,数组作为参数代入函数是作为指针来替代的.
[解决办法]
还没有结贴吗?

这是编译器行为,

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

记住一点,sizeof运算符只在编译期间可见,编译结束后就没有sizeof行为了,都变为常数了(例如对形参数组做sizeof等于对指针做sizeof,变为4)。

[解决办法]
似乎也只有在 sizeof 运算符里数组名表示整个数组, 其它情况下都是该数组首元素的地址;
特别式当数组名作为函数参数时会转化为数组首元素的指针;
[解决办法]
不知道你有没有明白;
你程序中的第一个 sizeof(a) 中的 a 被定义为一个数组;
第二个 sizeof(a) 中的 a 是个参数,会转化成常量指针;

热点排行