1.内存四区模型
各区元素分析
栈区:由编译器自动释放,存放函数参数的值,局部变量的值等。
堆区:一般由程序员分配和释放(动态的内存申请和释放),若程序员不释放,程序结束时可能? ? ? ? ? ? ? ? 由操作系统自动回收
全局区(静态区):存放全局变量和静态变量;初始化的全局变量和静态变量放在全局区的一块? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 区域中;未初始化的全局变量和静态变量放在另一块区域中,程序结束后有? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 操作系统释放
常量区:字符串常量和其他常量的存放位置,程序结束后由操作系统释放(属于静态区的中的常? ? ? ? ? ? ? ? ? 量区)
代码区:存放函数体的二进制代码
2.静态存储区
char* getStr1()
{
char* p1= "acbde";
return p1;
}
char* getStr2()
{
char* p2 = "ac";
return p2;
}
int main()
{
char* p1=NULL;
char* p2 = NULL;
p1 = getStr1();
p2 = getStr2();
//打印p1,p2所指向内存空间的数据
printf("p1:%s p2:%s\n", p1, p2);
//打印p1,p2的值(p1,p2的地址)
printf("p1:%d p2:%d\n", p1, p2);
//错误写法
//printf("p1:%s p2:%s\n", *p1, *p2);
return 0;
}
?注:1)指针指向谁就将谁的地址赋给指针
? ? ? ? ?2)当示例中的指针p1和p2所指向的内存空间保存的数据一样时,p1和p2的值相同。即p1? ? ? ? ? ? ? ? ? 和p2所指向的内存空间是同一块区域。(相同的数据在静态存储区中只会开辟一次内存)
? ? ? ? ?3)若p1为一个地址则以%s,%c格式打印,打印p1,打印的是p1所指向的内存中的数据,若? ? ? ? ? ? ? ? 给p1赋值为为字符型获知字符串类型的数据,则是给p1所指向的内存空间进行赋值。? ? ? ? ? ? ? ? ? ? 以%d格式打印,则打印的是p1的值
? ? ? ? ?4) 指针变量和指针所指向的内存空间变量是两个不同的概念
3.堆区/栈区
//堆区开辟空间
char* getStr1(int capacity)
{
char* p1 = NULL;
p1 = (char*)malloc(capacity * sizeof(char));
p1 = "123456";
if (p1 == NULL)
{
printf("err:mollc");
}
return p1;
}
//栈区开辟空间---不合理
char* getStr2()
{
char buf[64]="123456789";
return buf;
}
int main()
{
char* temp=NULL;
temp = getStr1(10);
if (temp == NULL)
{
printf("err");
}
char* p3 = temp;
printf("temp:%c p3:%c\n", temp,p3);//123456 123456
printf("temp:%d p3:%d\n", temp,p3);//33789 33789
temp = getStr2();
printf("%s\n", temp);//有可能出现宕机或不正常的输入
return 0;
}
注:1)使用字符串和字符对对字符指针进行赋值时:使用p而非*p
? ? ? ?2)? malloc申请的内存空间在堆区
? ? ? ?3)数组的内存空间开辟在栈区,函数执行完毕,数组所占的内存空间会被释放
? ? ? ?4)int * temp = (char*)malloc(sizeof(char)*5);//int类型的指针temp指向堆区中开辟的? ? ? ? ? ? ? ? ? ? ? 保存5个char类型数据的的地址空间的首地址
? ? ? ?5)一般情况下:栈的开口是向下的
? ? ? ?6) 数组的地址永远是从小到大
|