1、内存四区的建立流程
2、 各区元素分析
3、字符串常量
3.1 字符串常量保存在常量区
3.2 字符串常量保存在常量区
如果字符串常量是一样的 ,编译器会进行优化,地址是一样的
#include <stdio.h>
char* getStr1()
{
//char *p1 = "abcdef2"; 编译器会优化,abcdef2地址是一个
char *p1 = "abcdef2";
printf("getStr1() p1:%s\n",p1);
printf("getStr1() p1:%d\n",p1);
return p1;
}
char* getStr2()
{
char *p2 = "abcdef2";
printf("getStr2() p2:%s\n",p2);
printf("getStr2() p2:%d\n",p2);
return p2;
}
int main(int argc, char *argv[])
{
char *p1 = NULL;
char *p2 = NULL;
p1 = getStr1();
p2 = getStr2();
printf("p1:%s,p2:%s\n",p1,p2);
printf("p1:%d,p2:%d\n",p1,p2);
printf("Hello World!\n");
return 0;
}
堆栈
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
char *getMem(int num)
{
char *p1 = NULL;
p1 = (char*)malloc(sizeof(char)*num);//堆区
if(p1 == NULL)
{
printf("err222\n");
return NULL;
}
return p1;
}
char *getMem2(int num)
{
char buf[64];//栈区
strcpy(buf,"qweadd");
printf("getMem2:%s\n",buf);
}
int main(int argc, char *argv[])
{
char *tmp = NULL;
tmp = getMem(10);
if(tmp == NULL)
{
printf("err\n");
return -1;
}
strcpy(tmp,"abcd");
printf("tmp:%s\n",tmp);
tmp = getMem2(10);//局部变量,会有问题
printf("tmp2:%s\n",tmp);
printf("Hello World!\n");
return 0;
}