今天在学习程序运行中的堆栈的知识的时候发现在很多人的博客都用到了下面的代码
chars[] = "abc"; //栈
char*p3 = "123456"; //123456\\0在常量区,p3在栈上。
我的疑问就是同样是定义一个字符串,为啥以数组方式定义的变量就存在栈区,而使用指针定义的字符串变量确实存在于常量区
今天在学习程序运行中的堆栈的知识的时候发现在很多人的博客都用到了下面的代码
chars[] = "abc"; //栈
char*p3 = "123456"; //123456\\0在常量区,p3在栈上。
我的疑问就是同样是定义一个字符串,为啥以数组方式定义的变量就存在栈区,而使用指针定义的字符串变量确实存在于常量区
// 等价于char s[4] = "abc";即在栈上分配一个长度为4的字符数组并初始化
char s[] = "abc";
// 声明一个指针,指向一个字符串常量,改字符串常量被分配在常量区。
// 建议用const char *p = "1234";的形式
char*p3 = "123456"; //123456\\0在常量区,p3在栈上。
3 回答2.7k 阅读✓ 已解决
3 回答4.2k 阅读✓ 已解决
8 回答3.8k 阅读
4 回答2.8k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.6k 阅读✓ 已解决
4 回答1.9k 阅读
变量本身都是存放在栈上。至于为什么“以数组方式定义的变量就存在栈区,而使用指针定义的字符串变量确实存在于常量区”,这个跟所给的变量类型、以及赋值方式有关。
对于
char s[] = "abc";
这个语句来说,定义了一个 s[] 数组。在 C/C++ 中,这种数组赋值方式,会把数组元素值都放在栈上,直接在栈上分配空间来存放整个数组内容。
编译器在处理 "abc" 的时候,是依次把这个字符串的字符赋值给栈上的数组元素,并没有把这个字符串存放到常量区。
对于
char *p3 = "123456";
这个语句来说,p3 是一个指针。指针本身是一个整型值,它自身没有空间来存放 "123456" 这个字符串的值。
"123456" 字符串被分配在常量区,把 p3 指针指向常量区中的地址。
另外一个区别是,数组元素值可以修改。以数组方式定义的变量存在栈区,才能修改数组元素的值。例如,赋值之后,可以再次把 s[2] 赋值为 'd'。
常量区里面的字符不允许修改它们的值。