为什么结构体本身大小与结构体指针大小不一样

lj_suxin 2013-11-04 03:55:35
1. 为什么在以下结构体中sizeof(stu)!=sizeof(pstu),sizeof(stu)=12,sizeof(pstu)=4?
struct student
{
char *name;
int score;
char sex;

}stu,*pstu;

2.当我没在上述结构体中加char sex;时,sizeof(stu)=8,加了过后sizeof(stu)=12,为什么不是sizeof(stu)=9?我用的是devc++编译器。
...全文
1334 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lj_suxin 2013-11-06
  • 打赏
  • 举报
回复
谢谢各位
AnYidan 2013-11-04
  • 打赏
  • 举报
回复
google 字节对齐
5t4rk 2013-11-04
  • 打赏
  • 举报
回复
自己调试,看变量内存地址吧。 数据一目了然。
黑云压城 2013-11-04
  • 打赏
  • 举报
回复
任何类型的指针变量一般都占4个字节,结构体由于存在边界对齐问题,实际占用内存比真实所需内存大,根据边界对齐要求降序排列结构成员可以最大限度地减少浪费。sizeof返回的值包含了结构中浪费的内存空间。
liuhongwei110 2013-11-04
  • 打赏
  • 举报
回复
指针变量首先是个变量,是变量就会占内存大小,指针变量的大小与机器相关。
秃头披风侠 2013-11-04
  • 打赏
  • 举报
回复
查看"字节对齐"相关内容和"指针大小"相关内容
赵4老师 2013-11-04
  • 打赏
  • 举报
回复
#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
//
//
lj_suxin 2013-11-04
  • 打赏
  • 举报
回复
非常感谢各位!
做或不做 2013-11-04
  • 打赏
  • 举报
回复
指针 里面保存的是地址 4个字节 32bit 足够表示0到4G的虚拟地址空间 程序运行的时候 加载到相应的虚拟地址空间 通过页表 对应相应的内存地址 指针它不是个东西 它就是存的是地址
xiaohuh421 2013-11-04
  • 打赏
  • 举报
回复
在一般win32平台下, sizeof对所有类型的指针都是固定长度, 一般是4字节. sizeof对结构体就是其实际需要占的字节长度, 同时跟内部字节对齐方式有关.
光流溢彩 2013-11-04
  • 打赏
  • 举报
回复
?
sizeof(stu)!=sizeof(pstu),sizeof(stu)=12,sizeof(pstu)=4
sizeof(pstu)=4
pstu是指针所以是4
struct student 
 {
   char *name;
   int score; 
   char sex;     
        
 }stu,*pstu;
stu所占的内存是4+4+4(char sex),最后一个4是因为字节对齐的原因。
亞鬥 2013-11-04
  • 打赏
  • 举报
回复 1
根据字节对齐原则:结构体的总大小为结构体最宽基本类型成员大小的整数倍 最大是4个字节 所以结构体的大小永远是4的倍数
brightcm 2013-11-04
  • 打赏
  • 举报
回复
看一下关于字节对齐的资料就可以理解了

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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