鱼C论坛

 找回密码
 立即注册
查看: 4216|回复: 5

C结构体与函数问题

[复制链接]
发表于 2013-1-28 11:41:11 | 显示全部楼层 |阅读模式
5鱼币
strcut student
{long num;
char name[20];
float score;
char ch;
}stu;
则函数sizeof(stu)的值为29,求得出过程!!

最佳答案

查看完整内容

strcut student {long num; char name[20]; float score; char ch; }stu; 首先LONG占4个字节 char一个占1个字节 char name[20]中可以存20个char所以这个占20个字节 float 占4个字节 char ch;占1个字节 4+20+4+1=29个字节
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-1-28 11:41:12 | 显示全部楼层
strcut student
{long num;
char name[20];
float score;
char ch;
}stu;

首先LONG占4个字节
char一个占1个字节
char name[20]中可以存20个char所以这个占20个字节
float 占4个字节
char ch;占1个字节
4+20+4+1=29个字节
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-1-28 11:56:07 | 显示全部楼层
其实值不应该等于29,因为这涉及到内存对齐的概念,你可以自己去查一下。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-1-28 22:19:38 | 显示全部楼层
本帖最后由 思无邪 于 2013-1-28 22:25 编辑

这个和编译器有关的,不要求对齐的就是全部成员变量之和,有些编译器需要对齐,还需要计算对齐的字节和补空的字节。最好是再找些资料看看吧。我在UC中测试了下是 32.用下面的代码观察变量的地址变化或许你会明白。
  1. #include<stdio.h>

  2. int main()
  3. {
  4.         struct student
  5.         {
  6.                 long num;
  7.                  char name[20];
  8.                  float score;
  9.                  char ch;
  10.         }stu;
  11.         int n = sizeof(struct student);
  12.         printf("&stu = %p\n",&stu);
  13.         printf("&stu.num = %p\n",&(stu.num));
  14.         printf("&stu.name = %p\n",&(stu.name));
  15.         printf("&stu.score = %p\n",&(stu.score));
  16.         printf("&stu.ch = %p\n",&(stu.ch));
  17.         printf("n = %d\n",n);
  18.        
  19. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-1-29 01:01:51 | 显示全部楼层
本帖最后由 消失在黑暗中 于 2013-1-29 01:07 编辑

  1. vc默认的结构体内存对齐方式为:
  2. 结构体成员地址的偏移量为自己数据结构大小的倍数,而且结构体的大小必须是最大成员占用字节的倍数。

  3. 楼主的代码:
  4. struct student
  5. {long num;//4字节,偏移量为0
  6. char name[20];//20字节,偏移量为24
  7. float score;//4字节,偏移量为28
  8. char ch;//1字节,偏移量为29,结构体的大小必须是4(最大成员所占内存)的倍数,后面加3,大小变为32字节
  9. }stu;
  10. 总共占用内存32字节,不是29字节
复制代码
我改了下:
struct student
{long num;//4字节,偏移量为0
double dint;//8字节,偏移量为16,必须满足偏移量是8的倍数,存放num后,空出4字节的内存,后再加dint数据;
float score;//4字节,偏移量为20
char ch;//1字节,偏移量为21,又是同个问题,后面补上3个字节,结构体大小为24字节
}stu;

可能,不同编译器的默认对齐方式不一样

如何自己设置对其方式:
  1. #include <iostream.h>
  2. #include<Windows.h>

  3. #pragma pack(push)
  4. #pragma pack(1)//内存以字节对齐
  5. struct test
  6. {
  7.         char m1; //偏移量为0
  8.         double m4; //偏移量为1
  9.         int m3; //偏移量为9,结构体大小为13,无空隙分配内存
  10. }stu;

  11. #pragma pack(pop)



  12. int main()
  13. {
  14.         cout<<sizeof(stu)<<endl;//输出结果为13,结构体成员数据之间没有空隙
  15.         return 0;
  16. }
复制代码
  1. #include <iostream.h>
  2. #include<Windows.h>

  3. #pragma pack(push)
  4. #pragma pack(4)//4字节对齐
  5. struct test
  6. {
  7.         char m1; //偏移量为0,后加3字节,用于存放m4
  8.         double m4; //偏移量为4,
  9.         int m3; //偏移量为12,结构体大小为16
  10. }stu;

  11. #pragma pack(pop)



  12. int main()
  13. {
  14.         cout<<sizeof(stu)<<endl;
  15.         return 0;
  16. }
复制代码
如果#pragma pack(n)中的n大于变量所占用的内存,那么按默认存储变量。
如果n小于变量所占用的内存,那么按n存储数据

假如n大于所有的数据,结构体的大小是最大成员大小的倍数
否则结构体的大小时n的倍数,n取4或者8
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-2 15:09:34 | 显示全部楼层
{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}
噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-8 18:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表