char s[] = “abc”;与char *p3 = “123456”; 两个字符串存储在不同区域吗????
https://www.21ic.com/tougao/article/12884.html上面帖子里面一段代码,标注了相关变量所在的内存区域,关于内存分配的问题:
*********以下代码引用自上面链接*************
//main.c
int a = 0; //a在全局初始化数据区
char *p1; //p1在bss区(未初始化全局变量)
static int c = 0; //c在全局初始化数据区(c是全局静态变量)
struct employee
{
char name;
int age;
float score;
}e1; //e1在全局初始化数据区
int main()
{
int b; //b在栈区(局部变量)
char s[] = “abc”; //s在栈区,“abc”在常量区(全局初始化数据区)
char *p2; //p2在栈区
char *p3 = “123456”; //p3在栈区,“123456”在常量区(全局初始化数据区)
static int d = 0; //d在全局初始化数据区(静态局部变量)
struct student
{
char *name; //name在栈区,name指针指向是在堆区
int age;
float score;
}s1; //s1在栈区
p1 = (char*)malloc(10); //分配得来的10个字节的区域在堆区
p2 = (char*)malloc(20); //分配得来的20个字节的区域在堆区
name = (cahr *)malloc(20); //分配得来的20个字节的区域在堆区
/*从常量区的“Hello World”字符串复制到刚分配到的堆区*/
strcpy(p1, “Hello World”);
free(p1); //释放内存
free(p2); //释放内存
}
我在实际测试中:
char s[] = “abc”; //可以读写
char *p3 = “123456”;//只读
我的困惑是,这两个字符串存储的区域不一样吧??!!??
我觉得是你没看懂他想表达什么。
s这个变量在栈区,"abc"这个字符串在常量区;
char s[]="abc"是拿"abc"这个常量字符串去初始化s。s能够修改是因为s里的"abc"根本不是原来的常量字符串"abc"。
p这个变量在栈区,"123456"这个字符串在常量区。
p指向"123456",你不能修改*p是因为你不能修改常量字符串。 我被堆、栈、初始化变量区、未初始化变量区、动态存储区、静态存储区这些概念整蒙圈了{:5_99:}
char *str1;
str1 = "abcdef";
char str3[] = "abdfhjk46";
char str2[] = "abasasa";
printf("str1 add:%p\n",str1);
printf("str2 add:%p\n",str2);
printf("str3 add:%p\n",str3);
运行结果:
str1 add:00404069
str2 add:0060FEEA
str3 add:0060FEF2
大概算了一下:0060FEEA-00404069 大约20 BE81(2M左右存储间距),
这两个变量在不在同一存储区域? printf("str1 add:%p\n",&str1);
页:
[1]