l_ljian 发表于 2020-1-5 21:54:08

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”;//只读
我的困惑是,这两个字符串存储的区域不一样吧??!!??

Croper 发表于 2020-1-6 11:14:38

我觉得是你没看懂他想表达什么。

s这个变量在栈区,"abc"这个字符串在常量区;
char s[]="abc"是拿"abc"这个常量字符串去初始化s。s能够修改是因为s里的"abc"根本不是原来的常量字符串"abc"。

p这个变量在栈区,"123456"这个字符串在常量区。
p指向"123456",你不能修改*p是因为你不能修改常量字符串。

l_ljian 发表于 2020-1-10 23:57:20

我被堆、栈、初始化变量区、未初始化变量区、动态存储区、静态存储区这些概念整蒙圈了{: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左右存储间距),
这两个变量在不在同一存储区域?

yuanqun 发表于 2020-1-29 00:06:53

printf("str1 add:%p\n",&str1);
页: [1]
查看完整版本: char s[] = “abc”;与char *p3 = “123456”; 两个字符串存储在不同区域吗????