#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
//动态申请内存空间malloc
//通过malloc申请的空间会返回一个堆空间的首地址,把首地址存入变量p中,知道了首地址就可以通过
//strcpy函数往对应的空间存储字符数据
int i;
scanf("%d", &i);//输入要申请的空间大小
char* p;//声明一个指针变量p
p = (char*)malloc(i);
//malloc申请空间单位为字节;malloc返回值类型为void*,void*为无类型指针
//因为p的类型为char*,所以这里把malloc返回值类型强制转换为char*,要保持等号两边类型一致
strcpy(p, "malloc success");
puts(p);
free(p);//释放空间。free之后p本身的值没有变,但是申请空间里面保存的值被释放了,像借书还书一样
//释放之后,p的值必须与最初malloc当初返回的值一致
p = NULL;//如果不把p设置为null,则成p为野指针
return 0;
}
运行结果如下:
接下来我们来了解一下栈空间和堆空间的差异,先看栈空间,如下面代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
char* print_stack()
{
char c[17] = "I am print_stack";
puts(c);//能正常打印
return c;
}
int main()
{
char* p;
p = print_stack();//栈空间会随着函数的执行结束而释放
puts(p);//打印异常
return 0;
}
运行结果如下:
print stack()函数中的字符串存放在栈空间中,函数执行结束后,栈空间会被释放,字符数组c的原有空间已被分配给其他函数使用,因此在调用 print_stack()函数后执行puts(p)就会出现打印乱码。
再来看一下堆空间,代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
char* print_malloc()
{
char* p = (char*)malloc(20);
strcpy(p, "I am print_malloc");
puts(p);//能正常打印
return p;
}
int main()
{
char* p = print_malloc();
puts(p);//堆空间不会随着子函数的结束而释放
return 0;
}
运行结果如下:
print_malloc()函数中的字符串存放在堆空间中,堆空间只有在执行free操作后才会释放,否则在进程执行过程中会一直有效