内存分配是如何在指向char的双指针中工作的


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指向存储在调用线程堆栈上的chchh不是指向101+char*指针数组的指针,因此索引到chh的第100个槽是非法的(只有索引0是有效的,因为所有变量都可以被视为1个元素的数组(。此代码正在访问您不拥有的堆栈内存,将"hh"的地址写入chh的第100个插槽会损坏该堆栈上的随机内存(如果它没有因AccessViolation/SegFault而完全崩溃(。

表达式:

char* ch = "hi";

由于C++禁止向char*分配字符串文字,因此格式不正确,正确的语句必须是:

const char* ch = "hi";

也是如此

const char ** chh = &ch;

chchh都必须是const合格的。

chh[100]="hh"在做什么?

它不应该做任何事情,chh[100]是指向不属于chh的内存的指针,这会导致未定义的行为。

hh的地址存储在哪里?

"hh"是一个字符串文字,通常存储在只读内存中,这就是C++禁止将其分配给非常量指针的原因,因为您猜到,更改它的尝试会导致未定义的行为。

不要将其与分配给char数组混淆,这是合法的,因为会分配字符串文本的副本。

它试图将指针放在;hh"chh+100所指向的位置处的堆栈上的数组。你永远不应该这样做,因为你不知道会发生什么(也许这个内存被你代码的其他部分使用了。你可能会触发segfault或缓冲区溢出。

最新更新