结构体内存空间申请问题

wlcshh 2015-05-18 08:10:24
如 malloc(大小) 为结构体申请内存空间,可以这样
struct name * a = (struct name*)malloc(sizeof(name));
其中sizeof(name)等于10,但实际上结构体在内存中的占用空间并不是10字节,因为还存在字节对齐问题,
那为什么我们在使用结构体内存空间时又不会出现错误呢?
...全文
919 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
笨笨仔 2015-05-19
  • 打赏
  • 举报
回复
貌似对结构体取长度时,sizeof返回的长度是存在对齐问题。我们在开发中定义结构时,通常都会在结构的一些位置放置空字节,以解决对齐问题。
wlcshh 2015-05-19
  • 打赏
  • 举报
回复
引用 5 楼 VisualEleven 的回复:
sizeof操作符计算的时候会考虑结构体对齐的问题。
你确定?你自己做过实验了?
Eleven 2015-05-19
  • 打赏
  • 举报
回复
sizeof操作符计算的时候会考虑结构体对齐的问题。
worldy 2015-05-19
  • 打赏
  • 举报
回复
当你定义了一个结构体变量后,内存就存在了,你还要什么缓冲区?
wlcshh 2015-05-19
  • 打赏
  • 举报
回复
引用 2 楼 zgl7903 的回复:
typedef struct aa { char item[100]; aa *paa; //本身仅占用一个指针的长度,和分配了多少空间无直接关系 }
引用 1 楼 worldy 的回复:
[quote=引用 楼主 wlcshh 的回复:] 如 malloc(大小) 为结构体申请内存空间,可以这样 struct name * a = (struct name*)malloc(sizeof(name)); 其中sizeof(name)等于10,但实际上结构体在内存中的占用空间并不是10字节,因为还存在字节对齐问题, 那为什么我们在使用结构体内存空间时又不会出现错误呢?
编译器根据你的对齐要求,sizeof帮你算好了,实际上sizeof不是指令,我认为应该是一个宏[/quote] 那结构体怎么完整存入到自己的缓冲区?
赵4老师 2015-05-19
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#define field_offset(s,f) (int)(&(((struct s *)(0))->f))
struct AD  { int a; char b[13]; double c;};
#pragma pack(push)
#pragma pack(1)
struct A1  { int a; char b[13]; double c;};
#pragma pack(2)
struct A2  { int a; char b[13]; double c;};
#pragma pack(4)
struct A4  { int a; char b[13]; double c;};
#pragma pack(8)
struct A8  { int a; char b[13]; double c;};
#pragma pack(16)
struct A16 { int a; char b[13]; double c;};
#pragma pack(pop)
int main() {
    printf("AD.a %d\n",field_offset(AD,a));
    printf("AD.b %d\n",field_offset(AD,b));
    printf("AD.c %d\n",field_offset(AD,c));
    printf("\n");
    printf("A1.a %d\n",field_offset(A1,a));
    printf("A1.b %d\n",field_offset(A1,b));
    printf("A1.c %d\n",field_offset(A1,c));
    printf("\n");
    printf("A2.a %d\n",field_offset(A2,a));
    printf("A2.b %d\n",field_offset(A2,b));
    printf("A2.c %d\n",field_offset(A2,c));
    printf("\n");
    printf("A4.a %d\n",field_offset(A4,a));
    printf("A4.b %d\n",field_offset(A4,b));
    printf("A4.c %d\n",field_offset(A4,c));
    printf("\n");
    printf("A8.a %d\n",field_offset(A8,a));
    printf("A8.b %d\n",field_offset(A8,b));
    printf("A8.c %d\n",field_offset(A8,c));
    printf("\n");
    printf("A16.a %d\n",field_offset(A16,a));
    printf("A16.b %d\n",field_offset(A16,b));
    printf("A16.c %d\n",field_offset(A16,c));
    printf("\n");
    return 0;
}
//AD.a 0
//AD.b 4
//AD.c 24
//
//A1.a 0
//A1.b 4
//A1.c 17
//
//A2.a 0
//A2.b 4
//A2.c 18
//
//A4.a 0
//A4.b 4
//A4.c 20
//
//A8.a 0
//A8.b 4
//A8.c 24
//
//A16.a 0
//A16.b 4
//A16.c 24
//
//
zgl7903 2015-05-19
  • 打赏
  • 举报
回复
typedef struct aa { char item[100]; aa *paa; //本身仅占用一个指针的长度,和分配了多少空间无直接关系 }
worldy 2015-05-18
  • 打赏
  • 举报
回复
引用 楼主 wlcshh 的回复:
如 malloc(大小) 为结构体申请内存空间,可以这样 struct name * a = (struct name*)malloc(sizeof(name)); 其中sizeof(name)等于10,但实际上结构体在内存中的占用空间并不是10字节,因为还存在字节对齐问题, 那为什么我们在使用结构体内存空间时又不会出现错误呢?
编译器根据你的对齐要求,sizeof帮你算好了,实际上sizeof不是指令,我认为应该是一个宏

16,490

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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