当前位置:首页 » 编程语言 » c语言分配内存的方式

c语言分配内存的方式

发布时间: 2022-09-13 07:17:14

‘壹’ 在c语言中,如何给函数分配内存

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

‘贰’ c语言内存有几种分配方式

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

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

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

‘肆’ C语言中分配内存

要实现根据程序的需要动态分配存储空间,就必须用到以下几个函数
1、malloc函数
malloc函数的原型为:
void
*malloc
(u
igned
int
size)
其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。还有一点必须注意的是,当函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操作。
下例是一个动态分配的程序:
#include
#include
main()
{
int
count,*array;
/*count是一个计数器,array是一个整型指针,也可以理解为指向一个整型数组的首地址*/
if((array(int
*)
malloc(10*sizeof(int)))==NULL)
{
printf("不能成功分配存储空间。");
exit(1);
}
for
(count=0;count〈10;count++)
/*给数组赋值*/
array[count]=count;
for(count=0;count〈10;count++)
/*打印数组元素*/
printf("%2d",array[count]);
}
上例中动态分配了10个整型存储区域,然后进行赋值并打印。例中if((array(int
*)
malloc(10*sizeof(int)))==NULL)语句可以分为以下几步:
1)分配10个整型的连续存储空间,并返回一个指向其起始地址的整型指针
2)把此整型指针地址赋给array
3)检测返回值是否为NULL
2、free函数
由于内存区域总是有限的,不能不限制地分配下去,而且一个程序要尽量节省资源,所以当所分配的内存区域不用时,就要释放它,以便其它的变量或者程序使用。这时我们就要用到free函数。
其函数原型是:
void
free(void
*p)
作用是释放指针p所指向的内存区。
其参数p必须是先前调用malloc函数或calloc函数(另一个动态分配存储区域的函数)时返回的指针。给free函数传递其它的值很可能造成死机或其它灾难性的后果。
注意:这里重要的是指针的值,而不是用来申请动态内存的指针本身。例:
int
*p1,*p2;
p1=malloc(10*sizeof(int));
p2=p1;
……
free(p2)
/*或者free(p2)*/
malloc返回值赋给p1,又把p1的值赋给p2,所以此时p1,p2都可作为free函数的参数。
malloc函数是对存储区域进行分配的。
free函数是释放已经不用的内存区域的。
所以由这两个函数就可以实现对内存区域进行动态分配并进行简单的管理了。

‘伍’ C语言中的动态内存分配的用法举例

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

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

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

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

函数运算符:

new

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

指针变量=new 数据类型;

例如:

int *p=new int

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

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

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

delete

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

delete指针变量;

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

‘陆’ c语言程序怎么实现动态内存分配

1.p1=(int
*)malloc(10*sizeof(int));
//malloc
函数将会在动态存储区中分配一个长度为
10*sizeof(int)的
<连续>
空间。
而且p1的值是
分配域的起始地址;这就有一点像数组名了。
2.例如
int
temp[10];
int
*ptemp;
ptemp=temp;
//得到数组的首地址。
这样
ptemp
就可以
引用
数组的元素了。比如
ptemp[i];
当然
这是
固定分配内存的。
3.scanf("%d",&p1[btc]);

printf("%d",p1[btc]);
这两个函数

p1
的作用

是相当于数组名。
引用动态的数组。

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

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

‘捌’ c语言有几种分配内存的方式,有什么区别

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

‘玖’ c语言中什么是动态分配内存

c语言用函数malloc动态分配内存的,要用到指针,释放内存是free指针
malloc
原型:extern
void
*malloc(unsigned
int
num_bytes);

用法:#include
<malloc.h>

或#include<stdlib.h>

功能:用于向内存申请空间,分配长度为num_bytes字节的内存块

说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。

当内存不再使用时,应使用free()函数将内存块释放。

调用格式,

指针名=(指针所指对象的数据类型*)malloc(个数*sizeof(指针所指对象的数据类型)),其对应例子如下:

int
*p
=
(int
*)
malloc
(
n*
sizeof(int)
);

举例:

//
malloc.c

#include
<syslib.h>

#include
<malloc.h>

main()

{

char
*p;

clrscr();
//
clear
screen

p=(char
*)malloc(100);

if(p)

printf("Memory
Allocated
at:
%x",p);

else

printf("Not
Enough
Memory!\n");

if(p)

free(p);

getchar();

return
0;

}

热点内容
手机怎样给程序加密软件 发布:2025-01-12 06:47:11 浏览:824
地平线最高画质笔记本要什么配置才能玩 发布:2025-01-12 06:47:10 浏览:369
原神过主线任务脚本 发布:2025-01-12 06:34:51 浏览:514
医保电子密码在哪里找到 发布:2025-01-12 06:34:38 浏览:349
安卓手机有网却不能使用怎么办 发布:2025-01-12 06:25:20 浏览:213
arm存储器映射 发布:2025-01-12 06:25:12 浏览:250
安卓系统个人字典有什么用 发布:2025-01-12 06:13:37 浏览:929
geventpython安装 发布:2025-01-12 06:13:34 浏览:339
放松解压助睡眠直播 发布:2025-01-12 06:13:00 浏览:829
车载wince和安卓哪个好用 发布:2025-01-12 05:58:18 浏览:840