VC中结构体内存分配问题透析

江崎便猴

江崎便猴

2016-02-19 20:11

每个人都希望每天都是开心的,不要因为一些琐事扰乱了心情还,闲暇的时间怎么打发,关注图老师可以让你学习更多的好东西,下面为大家推荐VC中结构体内存分配问题透析,赶紧看过来吧!

本文首先提出了处理VC++中结构体时应注意的一个问题,然后详细分析了存在该问题的原因,最后做实战训练。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

      注意:

     (1)在VC下,下面各类型占字节数为:char-unsigned int -1; short int -2; int -unsigned int -4;  long -float-4;   double -long double -8

     (2)在TC下,下面各类型占字节数为:char-unsigned int -1; short int -2; int -unsigned int -2;  long -float-4;   double -8; long double -10

一、问题提出

首先,我们来看以下两个小程序:

  程序1:
#include stdio.h
struct struct1
{
char p1;

long p3;
};
main()
{
printf(″the size of the strcu=%d\n″, sizeof(struct1));
return(1);
}
  运行结果是:the size of the struct=8
  程序2:
#include stdio.h
struct struct2
{
char p1;
long p3;
short int p2;
};
main()
{printf(″the size of the struct=%d\n″, sizeof(struct2));
return(1);
}

  运行结果是:the size of the struct=12

问题:显然上述两个程序的运行结果是不同的。然而仔细观察上述两个程序,它们的唯一区别是变量p2在结构体struct struct1和struct struct2中的位置不同。而这一不同是如何导致程序运行结果不同呢?

二、VC++中的结构体分析

   C语言提供了一种称为结构体的数据类型,它可以将不同类型的数据组合成一个有机整体,这样不但便于引用,而且很清楚地反映出各数据项之间的内在联系,因而在C语言中结构体得到广泛的应用。正如我们已经熟知的那样,在C语言中,结构体的长度等于各数据项长度之和,而且结构体的长度与数据项在其中的位置顺序无关。例如,在TurboC中运行上述两个例子中的程序,得到的结果都是the size of the struct=7。这是由于char数据类型的长度是1,long数据类型的长度是4,而short int数据类型的长度是2,从而得到1+2+4=7。

  那么为什么上述两个例子在VC++环境下所得的结果各不相同并且均不是7呢?在实际应用中,我们发现VC++中为结构体变量分配内存时与C语言不同:VC++中为结构体分配内存时,先分配一单位长度(该单位长度的大小等于结构体中占内存最多数据类型,如struct2的单位长度为数据类型long的长度4。),然后在该单位长度中依次为结构中的变量分配空间,直至该单位空间不能再分配完一个完整的变量时为止,就再为该结构体分配另一个单位长度的存储空间。如结构体struct2:首先,分配4个字节,p1占1个字节后,剩余的3个字节不足以分配p3,于是,系统为struct2再分配4个字节分给p3,接着下4个字节分给p2,把以,struct2共有4+4+4=12个字节。再如结构体struct1:同样先分配4个字节,p1占1个字节后,还可为p2分配2个字节,显然剩余的1个字节不足以为p3分配空间了,因此系统还要再为该结构体分配4个字节,该4个字节恰好是p3所需的,所以struct1共有4+4=8个字节。

  至此我们便不难理解上述两个例子中的结果是如何算出来的。其中,例1中是4+4=8,而例2中是4+4+4=12。

三、实战
(1)、
struct structData1
{
 int i;
 char ch;
 double d;
 short  s;
 float f;
 long l;
};
sizeof(struct structDate1) =(4+1+3空)+(8)+(2+4+2空)+(4+4空)=32

(2)、
struct structData2
{
 short int s1;
 char ch1;
 short int s2;
 char ch2;
};
sizeof(struct structDate2) =(2)+(1+1空)+(2)+(1+1空)=8

(3)、
struct structData3
{
 int s1;
 char ch1;
 short int s2;
 char ch2;
};
sizeof(struct structDate3) =(4)+(1+2+1空)+(1+3空)=12

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)
展开更多 50%)
分享

猜你喜欢

VC中结构体内存分配问题透析

编程语言 网络编程
VC中结构体内存分配问题透析

基于Java 数组内存分配的相关问题

编程语言 网络编程
基于Java 数组内存分配的相关问题

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

透析虚拟内存

虚拟内存 windows 操作系统
透析虚拟内存

内核中的物理内存分配函数kernelapi

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
内核中的物理内存分配函数kernelapi

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

C++中动态内存分配引发问题的解决方案

编程语言 网络编程
C++中动态内存分配引发问题的解决方案

解析C语言中位字段内存分配的问题

编程语言 网络编程
解析C语言中位字段内存分配的问题

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

VC编辑框(EDIT)的自动换行、自动滚屏 、到指定行数自动清空

VC编辑框(EDIT)的自动换行、自动滚屏 、到指定行数自动清空

VC显示双缓冲

VC显示双缓冲
下拉加载更多内容 ↓