哇!这个数组怎么了?
typedef struct{
int a;
char b;
char c[];
}ARRAY0;
int main(int argc,char**argv){
printf("sizeof(int)=%d\n",sizeof(int));
printf("sizeof(char)=%d\n",sizeof(char));
printf("sizeof(ARRAY0)=%d\n",sizeof(ARRAY0));
ARRAY0 array0;
printf("sizeof(array0)=%d\n",sizeof(array0));
array0.c[2]='c';
printf("array0.c[2]=%c\n",array0.c[2]);
printf("sizeof(array0)=%d\n",sizeof(array0));
}
输出
sizeof(int)=4
sizeof(char)=1
sizeof(ARRAY0)=8
sizeof(array0)=8
array0.c[2]=c
sizeof(array0)=8
1. 请问为什么array0.c[2]=c这句话可以的呢?他到底被分配到哪里去了?????
2. 关于那个没有长度的数组是怎样处理的?
3. 像这种含有没有长度数组的结构体能这样用吗? 我看网上都说用malloc的~,用malloc的方法基本看得明,不知道像我这种array0.c[2]=c的用法有没有错误呢?
希望大家不吝赐教!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
本帖最后由 cokeboL 于 2011-05-24 16:38 编辑
回复 1# Horizon2012
难道结构声明里c[]的处理和零长数组差不多?c[2]就是*(c+2)的操作,因为该地址是存在的所以不会报错。但这个应该也是未定义行为吧?不要这么用了,除了眼花缭乱和不可预知的错误,没有什么实质意义。楼主也可以取sizeof(array0.c)试试,会报错的。
我明白了 其实ARRAY0 array0; 相当于在栈中开辟了这样的空间:
(根据栈由高往低成长)
每个O或者X代表一个字节
高------> 低
|
| X X X O 这个O是分配给array0.b ,其后三个XXX是用于对齐的,而array0.c是紧随着array0.b其后的X
| OO O O 这四个字节是分配给array0.a
低
array0.c[2] 也就是上图红色的那个,由于是分配了给程序,所以也就没啥问题了