哇!这个数组怎么了?

发布于 2022-10-15 06:11:55 字数 1234 浏览 21 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

零時差 2022-10-22 06:11:55

本帖最后由 cokeboL 于 2011-05-24 16:38 编辑

回复 1# Horizon2012

难道结构声明里c[]的处理和零长数组差不多?c[2]就是*(c+2)的操作,因为该地址是存在的所以不会报错。但这个应该也是未定义行为吧?不要这么用了,除了眼花缭乱和不可预知的错误,没有什么实质意义。楼主也可以取sizeof(array0.c)试试,会报错的。

指尖凝香 2022-10-22 06:11:55

我明白了 其实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] 也就是上图红色的那个,由于是分配了给程序,所以也就没啥问题了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文