免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2148 | 回复: 13
打印 上一主题 下一主题

请教 结构体 内存分配的问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-09-06 16:47 |只看该作者 |倒序浏览
我的代码是:

#include <stdlib.h>;
#include <stdio.h>;
#include <string.h>;


struct sStuData
{
        int No;
        char cName[5];
        char cBirthAddr[8];
        char cSex[5];
        //char cClass[10]
};
int main()
{
        char *buf;
        char buf1[15];
       
        struct sStuData stuData;
        printf("int length = %d\n",sizeof(int));

        printf("length = %d\n",sizeof(struct sStuData));
        printf("no length = %d\n",sizeof(stuData.No));
        printf("cname length = %d\n",sizeof(stuData.cName));
        printf("cbirthaddr length = %d\n",sizeof(stuData.cBirthAddr));
        printf("cSex length = %d\n",sizeof(stuData.cSex));
        //printf("cClass length = %d\n",sizeof(stuData.cClass));

        buf=malloc(15);
        memcpy(buf1,"abcdefghijklml",strlen("abcdefghijklml");
        memcpy(buf,buf1,10);
        printf("buf = %s\n",buf);

        memset(stuData.cName,0x00,5);
        memcpy(stuData.cName,buf,5);
        printf("stuData.cName = %s\n",stuData.cName);


}
结果是:

int length = 4
length = 24
no length = 4
cname length = 5
cbirthaddr length = 8
cSex length = 5
buf = abcdefghij
stuData.cName = abcd暨W


我想知道 结构体内存 应该是22
但是 结果是24。
还有成员 间的地址是连续分配的吗?

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
2 [报告]
发表于 2005-09-06 16:56 |只看该作者

请教 结构体 内存分配的问题!

找精华贴,或者翻以前的贴,或者在google上搜索。
这个问题没意思。

论坛徽章:
0
3 [报告]
发表于 2005-09-06 17:01 |只看该作者

请教 结构体 内存分配的问题!

内存对齐的问题。你的struct倘若如此声明:
struct something {
...
...
} __attribute__((packed));

那么就是严格的各个成员的大小之和。

论坛徽章:
0
4 [报告]
发表于 2005-09-06 17:09 |只看该作者

请教 结构体 内存分配的问题!

不想来回改代码的时候可以直接使用编译选项 -fpack-struct  :wink:

论坛徽章:
0
5 [报告]
发表于 2005-09-06 17:16 |只看该作者

请教 结构体 内存分配的问题!

加了之后
是对了!
我还想知道 在分配内存时是连续分配吗

结果如下:
int length = 4
length = 22
no length = 4
cname length = 5
cbirthaddr length = 8
cSex length = 5
buf = abcdefghij
stuData.cName = abcde暨W

如果是,
输出stuData.cName  后面为什么是乱码呢?

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
6 [报告]
发表于 2005-09-06 17:18 |只看该作者

请教 结构体 内存分配的问题!

如果我不用gcc请问如何指定 __attribute__((packed)); && -fpack-struct ?
另外,如果我在嵌入式上运行,而它的CPU不提供不对齐边界的访问怎么办?

治标不治本

论坛徽章:
0
7 [报告]
发表于 2005-09-06 17:23 |只看该作者

请教 结构体 内存分配的问题!

原帖由 "gvim" 发表:
如果我不用gcc请问如何指定 __attribute__((packed)); && -fpack-struct ?
另外,如果我在嵌入式上运行,而它的CPU不提供不对齐边界的访问怎么办?

治标不治本


要访问总是有办法的,不过在arm这样的架构上确实需要注意这个问题,
比如说就不能随意地对int类型的指针进行反引用。个人意见,如无特别
嗜好及需求,还是对齐的好。 :wink:

论坛徽章:
0
8 [报告]
发表于 2005-09-06 17:26 |只看该作者

请教 结构体 内存分配的问题!

对齐之后,为什么输出stuData.cName   时
仍然越界?

论坛徽章:
0
9 [报告]
发表于 2005-09-06 17:51 |只看该作者

请教 结构体 内存分配的问题!

原帖由 "gvim" 发表:
如果我不用gcc请问如何指定 __attribute__((packed)); && -fpack-struct ?
另外,如果我在嵌入式上运行,而它的CPU不提供不对齐边界的访问怎么办?

治标不治本



基本上所有c编译器都有对齐的选项。
对齐的问题存在所有CPU上

论坛徽章:
0
10 [报告]
发表于 2005-09-06 17:59 |只看该作者

请教 结构体 内存分配的问题!

原帖由 "wang_cao2190" 发表:
对齐之后,为什么输出stuData.cName   时
仍然越界?


'\0'
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP