静态分配
如果一个变量声明为全局变量或者是函数的静态变量,这个变量的存储将使用静态分配方式。静态分配的内存一般会被编译器放在数据段或代码段来存储,具体取决于实现。这样做的前提是,在编译时就必须确定变量的大小。 以IA32的x86平台及gcc编译器为例,全局及静态变量放在数据段的低端;全局及静态常量放在代码段的高端
自动分配
函数的自动局部变量应该随着函数的返回会自动释放(失效),这个要求在一般的体系中都是利用栈(Stack)来满足的。相比于静态分配,这时候,就不必绝对要求这个变量在编译时就必须确定变量的大小,运行时才决定也不迟,但是C89仍然要求在编译时就要确定,而C99放松了这个限制。但无论是C89还是C99,都不允许一个已经分配的自动变量运行时改变大小。
所以说C函数永远不应该返回一个局部变量的地址。
要指出的是,自动分配也属于动态分配,甚至可以用alloca函数来像分配堆(Heap)一样进行分配,而且释放是自动的。
动态分配
还有一种更加特殊的情况,变量的大小在运行时有可能改变,或者虽然单个变量大小不变,变量的数目却有很大d性,不能静态分配或者自动分配,这时候可以使用堆(Heap)来满足要求。ANSI C定义的堆 *** 作函数是malloc、calloc、realloc和free。
使用堆(Heap)内存将带来额外的开销和风险。
①C语言编码的时候不会开辟内存,只有在编译之后才会生成可执行程序,在可执行程序里面给出内存的开辟方法。
②真正内存的开辟是在程序运行的时候。程序装载到内存里面,开始运行才会真正开辟内存。
③C语言程序装载到内存中之后,其在内存中的进程空间中有代码区、全局数据区、堆区和栈区。代码区存放代码编译后的执行指令;全局数据区存放全局变量和静态变量;栈区存放函数内部的局部变量和返回地址,这部分内存是在函数调用时才申请的;堆区是自由申请内存的区域。需要使用malloc等自己分配内存,这部分内存需要自己释放。
④向int i;这样的句子,在C语言中,既是声明又是定义,所以这样的语句其实已经分配了内存,而不是等到赋值的时候。
⑤有不懂的可以追问。
编译器是自己按最大字节对齐~
也就是说
在这里面 int有4个字节 都已4字节对齐
char20 有20个字节
然后char sex 1个字节 但是对齐后变成4
最后整形是4
所以一共28
在程序前面
#pragma pack ()
就可以取消编译器自动对齐 会输出25
以上就是关于c语言内存有几种分配方式全部的内容,包括:c语言内存有几种分配方式、c语言开辟内存的问题、关于C语言中结构体所占内存大小的疑问,我用的编译器是VC6.0,int占4个字节,char型占1个字节,但结果为28等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)