C语言中各类数据类型在内存分配空间时所占空间分别是c语言int占几个字节节啊?谢谢各位

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
一名学生,一直呆在学校。读了好多年的书,处处显出书生气。
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(2096)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'struct
union 内存分配',
blogAbstract:'
struct union 内存分配(转) 结构体和共用体的内存分配是C语言的一个难点,也是面试题中的热点。
& Union data1
& char&&& c1;
& char&&& c2[9];&
& sizeof(union data1)的值为16.在编译器默认设置的情况下,该共用体最大基本类型为double,它占8字节,所以此共用体以8来对齐。字符数组c2占9个字节,那么整个共用体应该占9个字节,但按照对齐原则,实际分配给它的内存为16字节。',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:2,
publishTime:0,
permalink:'blog/static/',
commentCount:1,
mainCommentCount:1,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'一名学生,一直呆在学校。读了好多年的书,处处显出书生气。',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}posts - 2,&
comments - 3,&
trackbacks - 0
我们都知道在数据类型中,char类型占1个字节,short占2个字节,int占4个字节,long占8个字节等等。
在计算结构体大小时需要考虑其内存布局,结构体在内存中存放是按单元存放的,每个单元多大取决于结构体中最大基本类型的大小,下面我们看几个例子:
struct A{      }str1;
这里char占1个字节,int占4个字节,short占2个字节,按单元存放如下图:
  1  2  3  4
由于a占用了1个字节,b存不下,所以开辟新的单元存放b,然后再开辟新的单元存放c。
从这里可以看出结构体在内存中是按单元存放的,总占用字节数就是3*4=12。
struct B{      }str2;
存放如图:
  1  2  3  4
在这里由于b占用4个字节,而a和c总共才占用3个字节,足够c存放,所以c存放在a的后面,再开辟新的单元存放b。
此例中占用字节数为2*4=8。
struct c{    char b[2];  char c[4];}str3;
存放如图:
  1  2  3  4  5  6  7
这里由于数据类型都为char类型,故不必再开辟新的单元,一行存完。
占用字节数为1*1+2*1+4*1=7。
综上所述,结构体在内存中存放是按单元存放的,所开辟单元的最大长度取决于占字节最大的数据类型,此外我们可以发现存储顺序对空间的使用率有一定的影响。
从以上三例可以看出,第一种最浪费空间;第三种最节省空间,但全使用相同类型,丢失了字段本生的数据类型,不方便使用;第二种介于第一种和第三种写法之间,其空间上比较紧凑,同时又保持了结构体中字段的数据类型。大家可以尝试用sizeof()去深入了解结构体中的按单元存放。
阅读(...) 评论()通过一个小例子来简单理解C语言中的内存空间管理
作者:wind19
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了通过一个小例子来简单理解C语言中的内存空间管理,涉及到堆和栈等数据结构的基本知识,需要的朋友可以参考下
对于一个C语言程序而言,内存空间主要由五个部分组成代码段(.text)、数据段(.data)、BSS段(.bss),堆和栈组成,其中代码段,数据段和BSS段是编译的时候由编译器分配的,而堆和 栈是程序运行的时候由系统分配的。布局如下
在上图中,由编译器分配的地址空间都是在连接的时候分配的,而运行时分配的空间是在程序运行时由系统分配的
BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量和静态变量 (这里注意一个问题:一般的书上都会说全局变量和静态变量是会自动初始化的,那么哪来的未初始化的变量呢?变量的初始化可以分为显示初始化和隐式初始化,全局变量和静态变量如果程序员自己不初始化的话的确也会被初始化,那就是不管什么类型都初始化为0,这种没有显示初始化的就是我们这里所说的未初始化。既然都是0那么就没必要把每个0都存储起来,从而节省磁盘空间,这是BSS的主要作用)的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 BSS节不包含任何数据,只是简单的维护开始和结束的地址,即总大小,以便内存区能在运行时分配并被有效地清零。BSS节在应用程序的二进制映象文件中并不存在,即不占用磁盘空间 而只在运行的时候占用内存空间 ,所以如果全局变量和静态变量未初始化那么其可执行文件要小很多。
数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量和静态变量的一块内存区域。数据段属于静态内存分配,可以分为只读数据段和读写数据段。 字符串常量等,但一般都是放在只读数据段中 。
代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等,但一般都是放在只读数据段中 。
堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
栈 (stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变 量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以 栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。注意:栈空间是向下增长的,每个线程有一个自己的栈,在linux上默认的大小是8M,可以用ulimit查看和修改。
栈系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而堆是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低。
以下是一个简单的c文件,环境是OS--Linux,ARCH--PPC
##sta.c###
#include &stdio.h&
int kk[100] = {1,2,3,4,5};
int tt[100];
int main()
char a[10]= "abcd";
printf("i is %d/n");
经过gcc -S sta.c之后,生成的汇编代码如下
##sta.s###
.gnu_attribute 4, 2
.gnu_attribute 8, 3
kk, @object
.lcomm si.
si.2254, @object
.string "i is %d/n"
.string "abcd"
.globl main
main, @function
stwu 1,-32(1)
stw 0,36(1)
stw 31,28(1)
lis 9,.LC0@ha
la 9,.LC0@l(9)
lwz 0,0(9)
lbz 9,4(9)
stw 0,12(31)
stb 9,16(31)
stb 0,17(31)
stb 0,18(31)
stb 0,19(31)
stb 0,20(31)
stb 0,21(31)
lis 9,.LC1@ha
la 3,.LC1@l(9)
crxor 6,6,6
lwz 11,0(1)
lwz 0,4(11)
lwz 31,-4(11)
main, .-main
.ident "GCC: (GNU) 4.2.3"
.note.GNU-stack,"",@progbits
Note: 一般编译器和操作系统实现来说,对于虚拟地址空间的最低(从0开始的几K)的一段空间是未被映射的,也就是说它在进程空间中,但没有赋予物理地址,不能被访问。这也就是对空指针的访问会导致crash的原因 ,因为空指针的地址是0。至于为什么预留的不是一个字节而是几K,是因为内存是分页的,至少要一页;另外几k的空间还可以用来捕捉使用空指针的情况。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具后使用快捷导航没有帐号?
查看: 4382|回复: 6
本帖最后由 学习那点事 于
16:43 编辑
在C程序中字符串“China”和str数组在内存中各占几个字节?
& &&&关键是后者不太清楚!
在C程序中字符串“China”和str数组在内存中各占几个字节?
str数组是个什么意思?string类型的么?
Sting、浅 发表于
str数组是个什么意思?string类型的么?
是啊&&就是string字符串的意思
你那个str数组是什么意思我没弄清楚,china在内存中的存储除了5个字母外,还有一个空字符,“china\0”
J_K 发表于
你那个str数组是什么意思我没弄清楚,china在内存中的存储除了5个字母外,还有一个空字符,“china\0”
str数组就是string字符串的意思啊
你可以用sizeof在自己电脑上看看。。
Powered by Discuz!
& Comsenz Inc.

我要回帖

更多关于 c语言char占几个字节 的文章

 

随机推荐