【发布时间】:2015-03-12 11:21:19
【问题描述】:
据我所知,像“Hello”这样的字符串文字
在 C 中被认为是 char*,在 C++ 中被认为是 const char*,对于这两种语言,字符串文字都存储在 只读 内存中。(如果我错了,请纠正我)
#include <stdio.h>
int main(void)
{
const char* c1;
const char* c2;
{
const char* source1 = "Hello";
c1 = source1;
const char source2[] = "Hi"; //isn't "Hi" in the same memory region as "Hello" ?
c2 = source2;
}
printf("c1 = %s\n", c1); // prints Hello
printf("c2 = %s\n", c2); // prints garbage
return 0;
}
为什么 source1 和 source2 行为不同?(使用 gcc -std=c11 -W -O3 编译)
【问题讨论】:
-
以这种方式分配指针是不正确的!使用
strcpy -
@ForceBru 在编译时我什至没有收到任何警告
-
source2版本临时在堆栈上创建了一个本地数组,当您打印c2时,该数组已超出范围。如果您想在常量(“文本”)段中模拟字符串文字,请使用静态而不是自动存储。 -
我刚刚在 gcc 版本 4.8.2 上对其进行了测试,它打印出以下 c1 = Hello c2 = Hi 也使用了 -std=c11 标志
-
在 C++ 中,字符串文字是任何长度的
const char []类型。它们衰减为const char *指针。