一个进程或者说一个程序.可能有多个线程.
单线程
每个线程都有自己专属的栈(stack).
栈的最大尺寸是固定的,在OD的右下角,我们都看到过,超过那个范围就会引起栈溢出.
堆上的内存必须手工释放(C/C++),有的编程语言比如Java、Net不需要手动管理堆内存,语言本身有GC(垃圾回收机制)则另谈.以后我们再来讨论这个问题.
函数内部的局部变量(auto以及参数)一旦,函数运行完毕,则会自动从栈上释放.
int f_abc(int p_v1,int p_v2){
// C语言的形参是从右到左入栈的.
p_v2先入栈,p_v1 后入栈.
}
malloc ();
calloc (); 第一个参数指定单位的数量.
指定一个单位的大小./
realloc()
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main() {
int * lp = (int *)malloc(10 * sizeof(int));
free(lp);
// malloc只负责申请内存,但是不负责初始化内存,单独需要使用memset这个函数.
lp = (int *)calloc(10, sizeof(int));
//calloc这个函数,它申请的内存,会自动初始化为0.
free(lp);
system("pause");
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main() {
char * lp_1 = (char *)calloc(10, sizeof(char));
char * lp_temp = (char*)realloc(lp_1,
13);
//realloc可以修改申请的内存大小,不仅可以变大,还可以变小.
if (lp_1 == lp_temp)
{
printf("内存地址一样,未发生变化!
");
}
else
{
printf("内存地址不一样,发生变化!
");
}
//realloc追加的内存是不会进行初始化的.
free(lp_temp);
system("pause");