内存操作的三种方法
一.从静态存储区分配
从静态存储区域分配。是指内存在程序编译的时候就已经分配好,这块内存在程序的整
个运行期间都存在。例如全局变量,static 变量。(未初始化的内存分配在bss区,初始化的在数据区)
二.在栈上创建
在栈上创建内存。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函
数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集(栈区)
中,效率很高,但是分配的内存容量有限。
三.从堆区分配
从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意
多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存
期由我们决定,使用非常灵活,但问题也最多(注:关于malloc与new的解析见四)。(堆区)
内存操作经典示例
#include <stdio.h>
#include <stdlib.h>
char *itoa(int n)
{
// static char buf[20];
//要是不加static,编译器会提示,return返回的是局部变量的地址。
//局部变量在栈区,itoa函数结束,内存空间就被释放了,返回的值不确定
//加了static后,内存分配在BSS区,不会随着函数的返回而被释放掉。
char *buf;
//也可以直接放在itoa函数的参数位置 char *itoa(int n,char *buf),调用函数的时候,
//第二个参数可以只传一个NULL,但必须在函数定义里为buf 用malloc分配空间,否则也会段错误
buf = (char *)malloc(sizeof(buf));
//若使用malloc动态分配在堆上,也可以达到目的。但是要注意使用完后free掉内存空间,
//另外,若此时无malloc,
//只是char *buf会出现段错误(往一个没有内存空间的地址变量里写东西)
sprintf(buf,"%d",n);
return buf;
free(buf);
//return结束后释放,若在return之前释放,得不到任何返回值
//buf 被free后成为野指针,若要继续使用,可以先赋值为NULL,再进行指针操作
}
int main(int argc, char *argv[])
{
char *str = itoa(5);
printf("str is :%s\n",str);
return 0;
}