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

2016-02-19 20:11 10 1 收藏

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

【 tulaoshi.com - 编程语言 】

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

      注意:

     (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++中的结构体分析

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

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

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

  那么为什么上述两个例子在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

来源:http://www.tulaoshi.com/n/20160219/1622970.html

延伸阅读
用 vectors 改进内存的再分配 作者:Danny Kalev 编译:MTT 工作室 原文出处:Improving Memory Reallocation with Vectors 摘要: 本文描述的是一种很常见的情况:当你在某个缓存中存储数据时,常常需要在运行时调整该缓存的大小,以便能容纳更多的数据。本文将讨论如何使...
标签: 服务器
VC内存泄露检查工具:VisualLeakDetector 初识VisualLeakDetector灵活自由是C/C++语言的一大特色,而这也为C/C++程序员出了一个难题。当程序越来越复杂时,内存的管理也会变得越加复杂,稍有不慎就会出现内存问题。内存泄漏是最常见的内存问题之一。内存泄漏如果不是很严重,在短时间内对程序不会有太大的影响,这也使得内存泄漏问题有很强...
最近看到好多人说到tns或者数据库不能登录等问题,就索性总结了下面的文档。 首先来说Oracle的网络结构,往复杂处说能加上加密、LDAP等等。。这里不做讨论,重点放在基本的网络结构也就是我们最常用的这种情况 三个配置文件 listener.ora、sqlnet.ora、tnsnames.ora ,都是放在$ORACLE_HOMEetworkadmin目录下。 重点:...
字符串的处理是编程中会经常遇到的问题,在字符串处理中宽窄字符的转换是个很烦人的问题,往往在处理中为了在不同的函数中使用参数,要频繁的将字符在宽窄之间转换 下面是在工作中写的两个函数,实现宽窄字符的转换 /*********************************************************************** *      将窄字节转换为宽...
卵子在体内存活时间有多长? 卵子存活时间是多长? 卵子与精子相遇受精后才能 怀孕 ,大家对于卵子存活时间自然也非常关注。那么卵子存活时间是怎么算的呢?卵子在女性体内存活时间有多长呢?卵子排出后能存活多久?女人的卵子的寿命有多长?图老师小编带着各位来了解一下吧。 对女性来说,怀孕的...

经验教程

267

收藏

21
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部