函数体内定义的局部变量是auto变量,在函数调用开始时分配空间,这些空间位于栈区,函数调用结束后这些空间自动被释放。使用malloc申请得到的空间是堆区空间,不由函数机制控制,可以由程序的任何部分调用,需要手动使用free释放。之所以需要在堆内存中分配空间,是因为它可以跨函数引用,而且不需要(同样可以跨函数引用的)如全局变量、全局静态变量在进程开始后始终占用静态存储区直至进程退出,可以按需动态地分配和释放。(代价是通过指针等方式引用堆内存比栈内存中需要更多指令周期,效率要低;而且需要手动管理内存分配和回收。) 另外,相比堆内存,栈的内存一般是相当有限的,所以占用空间较大对象的管理一般都直接通过堆内存。 ==== [原创回答团]
1
#include<stdioh>
#include<stdlibh>
void main()
{
float p;
int i;
int M = 4;//我这里是直接赋的值,当然你也可以将M搞成用户输入值
p=(float )malloc(Msizeof(float));
p[0]=11;
p[1]=22;
p[2]=3;
p[3]=4;
for(i=0;i<M;i++)
printf("%f ",p[i]);
}
2
#include<stdioh>
#include<stdlibh>
void main()
{
int p;
int M=3,N=4;//我这里是直接赋的值,当然你也可以将M,N搞成用户输入值
p=(int )malloc(sizeof(int )M);
p[0]=(int )malloc(sizeof(int)N);
p[1]=(int )malloc(sizeof(int)N);
p[2]=(int )malloc(sizeof(int)N);
p[0][0]=71;
printf("%d",p[0][0]);
}
指针数组和数组指针是两个不同概念,你这里给出的定义实例实际上是指针数组的定义。
指针数组是指所定义数组的每个数组元素都是一个相应数据类型的指针,开设空间的 *** 作可以应用循环语句进行,例如:对于char p[10]; 可以应用
for(i=0;i<10;i++)
p[i]=(char )malloc(sizeof(char)N); //为每个指针申请开设N字符的存储空间
开设后,对于p的使用与二维数组的使用格式类似,可以有效的使用两个下标,
如 p[0][0]='A';
还可以像每个指针中赋值字符串: p[2]="Beijing"; 当然字符串长度应该小于N。
而数组指针,是指定义为指向某个固定大小顺序空间的指针,定义的格式如下:
char (pa)[10]; //定义一个指向拥有10元素的字符数组的指针,
int (p)[10];
应用格式可以参考下述程序,申请空间、赋值、输出后,可以观察到100被赋值到第五行第十个元素,指针可以像二维数组一样通过两个下标引用所申请开设的空间。
#include<alloch>
main()
{ int (p)[10];
int i,j,k;
p=(int()[10])malloc(sizeof(int()[10])5); //申请开设5个单元,每个单元拥有10个连续空间
p[4][9]=100;
for(i=0;i<5;i++)
{ for(k=0;k<10;k++)
printf("%8d",p[i][k]);
printf("\n");
}
}
指针所指对象的数据类型
,和前面的一起说明是指向对象的指针;
第二个是乘法运算;
(指针所指对象对的数据类型
)
这一句就是强制转换成对象的指针;
可以直接写成p=(char
)malloc(9),不过不建议用,推荐用
#define
size
9
……
……
……
p=(char
)malloc(size)
或者
const
int
p
=
9;
……
……
……
p=(char
)malloc(size)
这样你使用多次需要修改的话只用改动一个地点,避免遗漏,这种形式也便于记忆!
以上就是关于如何通过函数为指针变量分配内存全部的内容,包括:如何通过函数为指针变量分配内存、C语言怎么动态分配给指针空间、C语言中,怎么使用malloc函数为数组指针分配空间 比如要为char *p[ ]分配空间,应该怎么弄等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)