鉴于声明
char *s0 = "hello world";
char s1[] = "hello world";
假设以下假设的内存映射(列表示从给定行地址偏移 0 到 3 处的字符,因此例如右下角的 0x00 位于地址 0x0001000C + 3 = 0x0001000F):
+0 +1 +2 +3
0x00008000: 'h' 'e' 'l' 'l'
0x00008004: 'o' ' ' 'w' 'o'
0x00008008: 'r' 'l' 'd' 0x00
...
s0:0x00010000:0x00 0x00 0x80 0x00
s1:0x00010004:'h''e''l''l'
0x00010008: 'o' ' ' 'w' 'o'
0x0001000C: 'r' 'l' 'd' 0x00
字符串文字"hello world" 是一个由char(C++ 中为const char)组成的12 元素数组,具有静态存储持续时间,这意味着它的内存在程序启动时分配,并一直分配到程序执行终止。尝试修改字符串文字的内容会调用未定义的行为。
线
char *s0 = "hello world";
将s0 定义为指向char 的指针,具有自动存储持续时间(意味着变量s0 仅存在于声明它的范围内)并复制字符串的地址文字(本例中为0x00008000)。请注意,由于s0 指向字符串文字,因此不应将其用作任何尝试修改它的函数的参数(例如,strtok()、strcat()、strcpy() 等)。
线
char s1[] = "hello world";
将s1 定义为char 的12 元素数组(长度取自字符串文字),具有自动存储持续时间,并将文字的内容 复制到数组中。从内存映射中可以看到,我们有两个字符串"hello world" 的副本;不同的是可以修改s1中包含的字符串。
s0 和 s1 在大多数情况下可以互换;以下是例外情况:
sizeof s0 == sizeof (char*)
sizeof s1 == 12
type of &s0 == char **
type of &s1 == char (*)[12] // pointer to a 12-element array of char
您可以重新分配变量s0 以指向不同的字符串文字或另一个变量。您不能重新分配变量 s1 以指向不同的数组。