当前位置:首页 » 编程语言 » c语言内存分配方式
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言内存分配方式

发布时间: 2022-12-09 01:52:28

1. c语言中的动态内存分配的用法举例

1、malloc函数:其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。

2、free函数:由于内存区域总是有限的,不能不限制地分配下去,而且一个程序要尽量节省资源,所以当所分配的内存区域不用时,就要释放它,以便其它的变量或者程序使用。这时我们就要用到free函数。

3、calloc函数:其作用是在内存的动态存储区中分配n个长度为 size 的连续空间。函数返回一个指向分配区域的起始位置的指针;如果分配不成功,则返回NULL。

(1)c语言内存分配方式扩展阅读:

函数运算符:

new

运算符new用于向系统申请动态存储空间,并把首地址作为运算结果,它的使用形式为:

指针变量=new 数据类型;

例如:

int *p=new int

该语句的作用是会用new从内存中申请了一个int型变量(4个字节),并将该变量的首地址赋给指针变量p。

new所建立的变量的初始值是任意的,也可在用new分配内存的同时进行初始化。使用形式为:

指针变量=new 数据类型(初始值)。

delete

堆内存可按照要求进行分配,程序对内存的需求量随时会发生变化,有时程序在运行种可能会不再需要由new分配的内存空间,而且程序还未运行结束,这时就需要把先前占用的内存空间释放给堆内存,以后重新分配,供程序的其他部分使用。运算符delete用于释放new分配的内存空间,删除建立的对象,它的使用形式为:

delete指针变量;

其中的指针变量中保存着new分配的内存的首地址。

2. C语言各种数据在内存中的分配方式,分别对程序的运行效率有哪些影响

从另一个角度,从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式
和动态存储方式。
静态存储方式:是指在程序运行期间分配固定的存储空间的方式。
动态存储方式:是在程序运行期间根据需要进行动态的分配存储空间的方式。

3. c语言内存有几种分配方式

基本上C程序的元素存储在内存的时候有3种分配策略:
静态分配
如果一个变量声明为全局变量或者是函数的静态变量,这个变量的存储将使用静态分配方式。静态分配的内存一般会被编译器放在数据段或代码段来存储,具体取决于实现。这样做的前提是,在编译时就必须确定变量的大小。 以IA32的x86平台及gcc编译器为例,全局及静态变量放在数据段的低端;全局及静态常量放在代码段的高端
自动分配
函数的自动局部变量应该随着函数的返回会自动释放(失效),这个要求在一般的体系中都是利用栈(Stack)来满足的。相比于静态分配,这时候,就不必绝对要求这个变量在编译时就必须确定变量的大小,运行时才决定也不迟,但是C89仍然要求在编译时就要确定,而C99放松了这个限制。但无论是C89还是C99,都不允许一个已经分配的自动变量运行时改变大小。
所以说C函数永远不应该返回一个局部变量的地址。
要指出的是,自动分配也属于动态分配,甚至可以用alloca函数来像分配堆(Heap)一样进行分配,而且释放是自动的。
动态分配
还有一种更加特殊的情况,变量的大小在运行时有可能改变,或者虽然单个变量大小不变,变量的数目却有很大弹性,不能静态分配或者自动分配,这时候可以使用堆(Heap)来满足要求。ANSI C定义的堆操作函数是malloc、calloc、realloc和free。
使用堆(Heap)内存将带来额外的开销和风险。

4. C语言中内存的分配方式有哪3种,用文字或表达式列出各自的一个例子

1.malloc(n*sizeof(int))
/*
请求n个连续的、每个长度为整型的空间,若成功返回这些空间的首地址,失败返回0
*/
2.realloc(p,sizeof(int)*n)
/*
给一个已经分配了地址的指针重新分配空间,参数p为原有的空间地址*/
3.数组的定义。

5. c语言数组在内存中是怎么分配的

C语言中内存为分三类:栈区、堆区、静态数据区。

局部变量在栈上分配,函数调用前的栈指针,要和函数返回后的栈指针一样,否则就会出错。

void test(void)

{

char i,a[10];

printf("0x%x", &i);

printf("0x%x", a);

printf("0x%x", a+1);

printf("0x%x", a+2);

printf("0x%x", a+3);

}

(5)c语言内存分配方式扩展阅读

c语言数组在内存分配

示例:

#include<stdio.h>

int main()

{

int a[4] = {11,12,13,14};

int b[4] = {21,22,23,24};

int *pa = &a;

int i = 0;

while(i<8)

{

i++;

printf("now *p value = %d and",*pa);

printf("p addr value = %d ",pa);

pa++;

}

return 0;

}

6. C语言结构体在内存中的分配

因为内存对齐。
为了CPU更快地寻址,编译器会进行内存对齐。
char c1; //分配1字节空间
char c2; //分配1字节空间
short s; //上面的两个char占用空间刚好等于一个short,不会发生对齐,分配2字节空间
int i; //上面的两个char一个short占用空间刚好等于一个int,不会发生对齐,分配4字节空间
因此最后结构体test2的size为8字节
char c1; //分配1字节空间
short s; //地址未对齐,会发生内存对齐,补齐1字节的空间,然后再为short分配2字节空间
char c2; //分配1字节空间
int i; //地址未对齐,会发生内存对齐,补齐3字节的空间,然后再为int分配4字节空间
因此最后结构体test1的size为1+1(补齐)+2+1+3(补齐)+4=12字节
欲知详情,请网络“内存对齐”,这里不再详述。

7. c语言数组在内存中是怎么分配的

C语言中内存为分三类:栈区、堆区、静态数据区。

局部变量在栈上分配,函数调用前的栈指针,要和函数返回后的栈指针一样,否则就会出错。

void test(void)

{

char i,a[10];

printf("0x%x", &i);

printf("0x%x", a);

printf("0x%x", a+1);

printf("0x%x", a+2);

printf("0x%x", a+3);

}

(7)c语言内存分配方式扩展阅读

c语言数组在内存分配

示例:

#include<stdio.h>

int main()

{

int a[4] = {11,12,13,14};

int b[4] = {21,22,23,24};

int *pa = &a;

int i = 0;

while(i<8)

{

i++;

printf("now *p value = %d and",*pa);

printf("p addr value = %d ",pa);

pa++;

}

return 0;

}

8. C语言各种数据在内存中的分配方式,分别对程序的运行效率有哪些影响

内存分配?
堆栈的综合效率最高(除寄存器外),一般函数(包括main())的变量都是在堆栈内的。
你可以显示声明register 但是是存在寄存器还是一般的堆栈完全由编译器决定优化,其实你加了也没用。。。。。堆栈是在内存的一块固定大小的区域,比较小,数据量大了会爆栈(综合最高是因为会有部分内容进入寄存器,寄存器比内存快)。
全局变量是在全局变量区的,全局变量区是在内存中的固定大小的一块区域。全局变量区也不怎么大,但是比堆栈大多了。。。。
函数代码区。。。是在内存 你无视好了。。。
堆区 是在内存的一块很大很大的区域,一切动态建立的对象(c用alloc家族函数 c++的new)都是在堆区,一般堆区是不会爆的,除非真的很大大大大大。。
效率上讲 寄存器最快,然后就是内存了,磁盘的读写不考虑。
综上,编译器会帮你优化的,你只要关心会不会爆栈,会不会爆全局变量,就行了。。
还有字符串常量区,也是在内存中的,你也无视好了。。。。。
还有静态区也是在内存中的,大小是编译器编译时决定的,你也无视好了。。。。

9. 在C语言中,如何给函数分配内存

不知lz有没听说过虚存一说,当源码被编译成二进制文件后,其中的变量,函数的虚拟地址,也就是内存空间中的地址就已确定,在运行时,操作系统为其分配物理内存并添加虚拟地址到物理地址的映射。
再说的多一点,一个进程(运行的程序)可分为若干段:代码段、数据段、堆栈段等,其中函数所操作的空间(也就是局部变量的空间)就位于堆栈段,所谓函数分配内存大小,实际就是堆栈段指针的变化而已。

10. c语言有几种分配内存的方式,有什么区别

一般而言,有两种内存分配的方式。
1、在栈上分配。特点是当变量离开其作用域时,其内存即释放了,例如局部变量、函数参数等都是在栈上分配的。
2、在堆上分配。特点是变量一直存在,例如new运算符分配出来的内存、全局变量和static静态变量都是在堆上分配的。