读书人

C语言sizeof()等于0的有关问题请大侠

发布时间: 2012-02-11 09:51:35 作者: rapoo

C语言sizeof()等于0的问题,请大侠出手
在VC6.0环境中
{

extern const ROOT_MENU_PARAM *r_menu_e_param[];

unsigned int leng_ent = sizeof(r_menu_e_param);
unsigned int every = sizeof(ROOT_MENU_PARAM *);

}

数组r_menu_e_param是在外部文件中定义的,这痒在debug情况下发现
leng_ent 的值为0
但是在debug的变量观察窗口,观察sizeof(r_menu_e_param)的值为20.

问题是为什么赋值给leng_ent后的值就变成0了????

请大侠出手!


[解决办法]
sizeof(r_menu_e_param);这个应该至少给个warning的,不完整类型,不可以用sizeof运算。
把[]里的东西填上。
[解决办法]
给你写个extern const ROOT_MENU_PARAM *r_menu_e_param[],你知道r_menu_e_param占用了多少空间吗?
[解决办法]
可能没有使用[]会被编译器转为0
[解决办法]
因为编译器不知道。 所以给了个0。

extern的数组在sizeof时要注意。
你不如把leng_ent也extern得了。

[解决办法]
extern const ROOT_MENU_PARAM *r_menu_e_param[]是一个声明语句,表示要引用其它编译单元定义的数组r_menu_e_param,但是并没有给出数组的大小,这叫做imcomplete type.所以,在本编译单元内部,编译器在生成obj的时候是无法知道r_menu_e_param的大小的。

但是到了链接阶段,链接器就可以把该编译单元的r_menu_e_param声明与其它编译单元中定义的
r_menu_e_param对应起来,也就是链接过后的可执行文件中,已经可以知道global的r_menu_e_param数组的实际大小。所以在运行的时候对r_menu_e_param使用sizeof操作符,可以知道大小。

但是在编译extern const ROOT_MENU_PARAM *r_menu_e_param[]所在的c文件时(也就是在链接之前),是无法得知r_menu_e_param数组的大小的。

另外,VC下确实也给出了一条警告:
warning C4034: sizeof returns 0


[解决办法]
这个应该会给警告的

extern的东西只有申明, 在实际的编译代码中是啥都没有的, 根本不会占用内存
[解决办法]
学习了
[解决办法]
同感,向各位学习了
[解决办法]
up~~

读书人网 >C语言

热点推荐