有关sizeof和static的问题

guan323333 2010-09-02 02:38:44
这个运算符和关键字一直很难搞清楚啊,刚看到面试宝典上说sizeof只计算栈上的内存容量,很好奇得试了下下面的代码

static char temp[10] = {"1234"};
printf("sizeof=%d\n",sizeof(temp));


结果竟然等于10....为什么呢? static关键字说明的不是全局变量吗? 怎么sizeof的结果还是10呢?

另外,还有个问题就是如下声明:

strtuc AA
{
int a;
int b;
static int c;
}aa;


按照面试宝典上的意思是sizeof(aa)应该为8,因为c是在全局处,这个结果对吗?
我用VC6.0试了下,悲剧的是竟然说我声明出错...

error C2246: 'c' : illegal static data member in locally defined class


为什么呢? struct里应该可以声明static变量的吧 这样声明哪错了,高人指点下,大家一起学习学习.
...全文
826 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
Aegean_sea007 2012-07-01
  • 打赏
  • 举报
回复
关于sizeof与struct的的那个,我在百度百科上查sizeof()时看过,上面有解释,
还有我记得在类里面,如果有static量,sizeof()是不计算static量的大小的。。。。
赵4老师 2010-09-02
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
aozhi 2010-09-02
  • 打赏
  • 举报
回复
sizeof是编译时运算符,它只能在编译时计算。所以用malloc分配的空间大小,不能用sizeof计算。
编译时分配的空间包括全局区,静态区,栈。看来是书写错了,或者还有什么上下文。

第二个问题,因为aa在栈中,c在静态区中,所以计算aa的size就只计算栈中的了。
好想试试
static struct AA
{
int a;
int b;
static int c;
}aa;
结果如何,可惜手头没有编译器。
zotin 2010-09-02
  • 打赏
  • 举报
回复
sizeof返回的值是说某个类型的大小。所谓类型的大小是说存储某个类型大小的数据所需要空间。
所以当我们需要动态分配空间来存储某种类型的数据的时候,可以利用sizeof来确定大小。


struct AA
{
int a;
int b;
static int c;
};

中c是静态的,在所有AA类型的数据中,并没有一个单独的c存在。我们通常说AA类型的数据共享成员c。所以AA的数据所需要的空间不包括c占用的空间。也就是说,AA的大小就不包含c的大小。只有a和b的大小。


guan323333 2010-09-02
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 we_sky2008 的回复:]
引用 13 楼 guan323333 的回复:
引用 10 楼 we_sky2008 的回复:
引用 7 楼 guan323333 的回复:
LS正解,cout<<sizeof(AA)<<endl; 结果为8,是没计算c变量的内存容量.

但是为什么下面的代码是错的,把类的声明放在main里就是错的:

C/C++ code

int main()
{
struct AA
……
[/Quote]

猛男,谢拉
guan323333 2010-09-02
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zotin 的回复:]
引用
sizeof只计算栈上的内存容量

这不是鬼话么!如果计算的是栈上的内容,那么sizeof(int)是什么?类型还能跑栈上去了?
这种宝典跟葵花宝典一样是害人的东西。
[/Quote]

那为什么那个sizeof(AA)的结果是8呢.. 谁解释下啊
we_sky2008 2010-09-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 guan323333 的回复:]
引用 10 楼 we_sky2008 的回复:
引用 7 楼 guan323333 的回复:
LS正解,cout<<sizeof(AA)<<endl; 结果为8,是没计算c变量的内存容量.

但是为什么下面的代码是错的,把类的声明放在main里就是错的:

C/C++ code

int main()
{
struct AA
{
int a;
int b;
static……
[/Quote]
sizeof的操作数是数组时,其大小就是数组的静态大小,你定义的是10, 当然也就是10了
第二个你不是已经明白了吗?静态成员变量每个类共享一个,所以sizeof(aa) == 8
guan323333 2010-09-02
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 iealien 的回复:]
引用 12 楼 we_sky2008 的回复:

劝楼主还是别看那本宝典了
我从你说的页数附近看了几眼就发现了两个错误:

C/C++ code

string strArr1[] = {"Trend", "Micro", "Soft"};
//书上说sizeof (strArr1) == 12; 明明应该是3 * sizeof(string); string是一个类,并不是指针类……
[/Quote]

你别只看结果好吗...
iealien 2010-09-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 we_sky2008 的回复:]

劝楼主还是别看那本宝典了
我从你说的页数附近看了几眼就发现了两个错误:

C/C++ code

string strArr1[] = {"Trend", "Micro", "Soft"};
//书上说sizeof (strArr1) == 12; 明明应该是3 * sizeof(string); string是一个类,并不是指针类型

//居然能举出这样的例子:
int ss[100]……
[/Quote]
这个是对的 sizeof(string)=4
zotin 2010-09-02
  • 打赏
  • 举报
回复
引用
sizeof只计算栈上的内存容量

这不是鬼话么!如果计算的是栈上的内容,那么sizeof(int)是什么?类型还能跑栈上去了?
这种宝典跟葵花宝典一样是害人的东西。
zrebecca 2010-09-02
  • 打赏
  • 举报
回复
sizeof的本来就应该是10呀,有什么问题?
guan323333 2010-09-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 we_sky2008 的回复:]
引用 7 楼 guan323333 的回复:
LS正解,cout<<sizeof(AA)<<endl; 结果为8,是没计算c变量的内存容量.

但是为什么下面的代码是错的,把类的声明放在main里就是错的:

C/C++ code

int main()
{
struct AA
{
int a;
int b;
static int c;
}aa;

int AA::……
[/Quote]

恩,这个问题解决了,那为什么结果是8呢?
而第一个问题结果却是10?
we_sky2008 2010-09-02
  • 打赏
  • 举报
回复
劝楼主还是别看那本宝典了
我从你说的页数附近看了几眼就发现了两个错误:


string strArr1[] = {"Trend", "Micro", "Soft"};
//书上说sizeof (strArr1) == 12; 明明应该是3 * sizeof(string); string是一个类,并不是指针类型

//居然能举出这样的例子:
int ss[100] = "0123456789";
iealien 2010-09-02
  • 打赏
  • 举报
回复
第2个问题 要初始化静态变量哎
we_sky2008 2010-09-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 guan323333 的回复:]
LS正解,cout<<sizeof(AA)<<endl; 结果为8,是没计算c变量的内存容量.

但是为什么下面的代码是错的,把类的声明放在main里就是错的:

C/C++ code

int main()
{
struct AA
{
int a;
int b;
static int c;
}aa;

int AA::c = 0;

……
[/Quote]
局部类不允许有静态数据成员
guan323333 2010-09-02
  • 打赏
  • 举报
回复
我擦,那你说啊
iealien 2010-09-02
  • 打赏
  • 举报
回复
guan bi 不懂来问我啊 static关键字和链接类型有关!
guan323333 2010-09-02
  • 打赏
  • 举报
回复
LS正解,cout<<sizeof(AA)<<endl; 结果为8,是没计算c变量的内存容量.

但是为什么下面的代码是错的,把类的声明放在main里就是错的:

int main()
{
struct AA
{
int a;
int b;
static int c;
}aa;

int AA::c = 0;

cout<<sizeof(AA)<<endl;
cout<<sizeof (array)<<endl;
//cout<<sizeof (extern_array)<<endl;//sizeof不能计算外部数组的大小,因为外部数组声明时可以不声明其大小

system("pause");
return 0;
}

羽飞 2010-09-02
  • 打赏
  • 举报
回复
大家说的很清楚,又学习了
  • 打赏
  • 举报
回复
面试宝典错误无数。

楼主加油发掘。我记得还有很多的。
加载更多回复(4)

69,371

社区成员

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

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