char *p = "string"; //creates pointer to constant string
char p[] = "string"; //just an array with "string"
我有点困惑,为什么在第一个例子中它会创建一个指向常量字符串的指针?它不应该只是一个指向内存中“string”位置的指针吗?
char *p = "string"; //creates pointer to constant string
char p[] = "string"; //just an array with "string"
我有点困惑,为什么在第一个例子中它会创建一个指向常量字符串的指针?它不应该只是一个指向内存中“string”位置的指针吗?
"string"
可能存储在进程的只读区域,因此尝试修改由 p
指向的内存会导致未定义的行为。+---+ +---+---+---+---+---+---+---+
| | ----> | s | t | r | i | n | g | \0|
+---+ +---+---+---+---+---+---+---+
p
+---+---+---+---+---+---+---+
| s | t | r | i | n | g | \0|
+---+---+---+---+---+---+---+
p
遗憾的是,在 C 语言中(并且在 C++03 中也是为了兼容性而合法),可以这样做。但是,任何尝试通过指针修改字符串字面值都会导致未定义行为。因此,最好始终将字符串字面值赋值给一个const char*
const char * cp = "Hello"; //OK
char* p = "Hello"; //OK in C and C++03 (unfortunately), Illegal in C++11
cp[0] = 'Y'; //Compile-time error, good
p[0] = 'Y'; //no compiler error, undefined behavior
char *p="string";
char p[] = "string";
因此,每次运行时分配了这些内存,因此p的内容会更改。