⑴ C语言问题:内存的分配方式有哪几种
1、静态存储区分配
内存分配在程序编译之前完成,且在程序的整个运行期间都存在,例如全局变量、静态变量等。
2、栈上分配
在函数执行时,函数内的局部变量的存储单元在栈上创建,函数执行结束时这些存储单元自动释放。
3、堆上分配
堆分配(又称动态内存分配)。程序在运行时用malloc或者new申请内存,程序员自己用free或者delete释放,动态内存的生存期由我们自己决定。
(1)内存分配算法c扩展阅读
栈上分配数组
#include<iostream>
usingnamespacestd;
voidmain()
{
int**arr=NULL;//int型二维数组
introws,columns;
cin>>rows;//2
cin>>columns;//3
//请在此处编写代码,根据rows和columns在栈上分配一个数组arr
...你的代码...
//赋值给数组元素
for(introwIndex=0;rowIndex<rows;rowIndex++)
{
for(intcolumnIndex=0;columnIndex<columns;columnIndex++)
{
arr[rowIndex][columnIndex]=columnIndex+(rowIndex+1)*1000+1;
}
}
//打印每个数组元素
for(rowIndex=0;rowIndex<rows;rowIndex++)
{
for(intcolumnIndex=0;columnIndex<columns;columnIndex++)
{
printf("%d",arr[rowIndex][columnIndex]);
}
printf(" ");
}
}
⑵ c语言内存有几种分配方式
基本上C程序的元素存储在内存的时候有3种分配策略:
静态分配
如果一个变量声明为全局变量或者是函数的静态变量,这个变量的存储将使用静态分配方式。静态分配的内存一般会被编译器放在数据段或代码段来存储,具体取决于实现。这样做的前提是,在编译时就必须确定变量的大小。 以IA32的x86平台及gcc编译器为例,全局及静态变量放在数据段的低端;全局及静态常量放在代码段的高端
自动分配
函数的自动局部变量应该随着函数的返回会自动释放(失效),这个要求在一般的体系中都是利用栈(Stack)来满足的。相比于静态分配,这时候,就不必绝对要求这个变量在编译时就必须确定变量的大小,运行时才决定也不迟,但是C89仍然要求在编译时就要确定,而C99放松了这个限制。但无论是C89还是C99,都不允许一个已经分配的自动变量运行时改变大小。
所以说C函数永远不应该返回一个局部变量的地址。
要指出的是,自动分配也属于动态分配,甚至可以用alloca函数来像分配堆(Heap)一样进行分配,而且释放是自动的。
动态分配
还有一种更加特殊的情况,变量的大小在运行时有可能改变,或者虽然单个变量大小不变,变量的数目却有很大弹性,不能静态分配或者自动分配,这时候可以使用堆(Heap)来满足要求。ANSI C定义的堆操作函数是malloc、calloc、realloc和free。
使用堆(Heap)内存将带来额外的开销和风险。
⑶ c语言数组在内存中是怎么分配的
C语言使用的内存是虚拟内存。按照功能的不同在C语言中又将虚拟内存为分三类:栈区、堆区、静态数据区,不管是单一变量还是数组,其内存分配都是这样分的。
在栈区、静态数据区、堆区会有编译器负责分配、操作系统负责管理,程序员可以在堆区使用malloc()来动态分配堆内存的问题。
(3)内存分配算法c扩展阅读
内存的分配和释放注意事项:
1、malloc和free是库函数,不是系统调用
2、malloc实际分配的内存可能会比请求的多---有些编译器分配时是以4字节为单元的
3、不能依赖于不同平台的下的malloc
4、当请求的动态内存无法满足时malloc返回的是NULL
5、当free的参数为NULL时,函数直接返回
⑷ C语言中的动态内存分配的用法举例
1、malloc函数:其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。
2、free函数:由于内存区域总是有限的,不能不限制地分配下去,而且一个程序要尽量节省资源,所以当所分配的内存区域不用时,就要释放它,以便其它的变量或者程序使用。这时我们就要用到free函数。
3、calloc函数:其作用是在内存的动态存储区中分配n个长度为 size 的连续空间。函数返回一个指向分配区域的起始位置的指针;如果分配不成功,则返回NULL。
(4)内存分配算法c扩展阅读:
函数运算符:
new
运算符new用于向系统申请动态存储空间,并把首地址作为运算结果,它的使用形式为:
指针变量=new 数据类型;
例如:
int *p=new int
该语句的作用是会用new从内存中申请了一个int型变量(4个字节),并将该变量的首地址赋给指针变量p。
new所建立的变量的初始值是任意的,也可在用new分配内存的同时进行初始化。使用形式为:
指针变量=new 数据类型(初始值)。
delete
堆内存可按照要求进行分配,程序对内存的需求量随时会发生变化,有时程序在运行种可能会不再需要由new分配的内存空间,而且程序还未运行结束,这时就需要把先前占用的内存空间释放给堆内存,以后重新分配,供程序的其他部分使用。运算符delete用于释放new分配的内存空间,删除建立的对象,它的使用形式为:
delete指针变量;
其中的指针变量中保存着new分配的内存的首地址。
⑸ C语言中内存的分配方式有哪3种,用文字或表达式列出各自的一个例子
1.malloc(n*sizeof(int))
/*
请求n个连续的、每个长度为整型的空间,若成功返回这些空间的宏困首地址,氏拍失败返回0
*/
2.realloc(p,sizeof(int)*n)
/*
给一个蔽核念已经分配了地址的指针重新分配空间,参数p为原有的空间地址*/
3.数组的定义。
⑹ c语言有几种分配内存的方式,有什么区别
一般而言,有两种内存分配的方式。
1、在栈上分配。特点是当档蚂变量离开其作用域时,其内存即释放了,例如局部变量、函数参数等都是在栈上分配的。
2、在堆上分配孝念。特点是变量一直存在,例如new运算符分配出来的内存、全局变量和static静态变量都是在堆上分配巧蠢困的。