int main(){
char * ch = "hi";
char ** chh = &ch;
chh[100] = "hh";
}
chh[100] = "hh"
在做什么?
"hh"
的地址存储在哪里?
"hi"
和"hh"
是字符串文字,都属于const char[3]
类型,它们会衰减为指向其第一个char
元素的const char *
指针。数组在编译时存储在程序的只读静态内存中。
在运行时,该静态存储器中的"hi"
的地址存储在ch
指针中(这在C++11及更高版本中是非法的,因为非常量的char*
指针不能指向const char
数据(,则ch
的地址存储到chh
指针中。
语句chh[100]="hh"
是未定义的行为。chh
指向存储在调用线程堆栈上的ch
。chh
不是指向101+char*
指针数组的指针,因此索引到chh
的第100个槽是非法的(只有索引0是有效的,因为所有变量都可以被视为1个元素的数组(。此代码正在访问您不拥有的堆栈内存,将"hh"
的地址写入chh
的第100个插槽会损坏该堆栈上的随机内存(如果它没有因AccessViolation/SegFault而完全崩溃(。
表达式:
char* ch = "hi";
由于C++禁止向char*
分配字符串文字,因此格式不正确,正确的语句必须是:
const char* ch = "hi";
也是如此
const char ** chh = &ch;
ch
和chh
都必须是const
合格的。
chh[100]="hh"
在做什么?
它不应该做任何事情,chh[100]
是指向不属于chh
的内存的指针,这会导致未定义的行为。
hh
的地址存储在哪里?
"hh"
是一个字符串文字,通常存储在只读内存中,这就是C++禁止将其分配给非常量指针的原因,因为您猜到,更改它的尝试会导致未定义的行为。
不要将其与分配给char
数组混淆,这是合法的,因为会分配字符串文本的副本。
它试图将指针放在;hh"chh+100所指向的位置处的堆栈上的数组。你永远不应该这样做,因为你不知道会发生什么(也许这个内存被你代码的其他部分使用了。你可能会触发segfault或缓冲区溢出。