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

标签 c++

int main(){

    char * ch = "hi";
    char ** chh = &ch;
    chh[100] = "hh";
}

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

"hh" 的地址存储在哪里?

最佳答案

"hi""hh" 是字符串文字,都是 const char[3] 类型,它们会衰减为 const char * 指向它们的第一个 char 元素的指针。这些数组在编译时存储在程序的只读静态内存中。

在运行时,"hi" 在静态内存中的地址被存储在 ch 指针中(这在 C++11 及更高版本中是非法的,因为非 const char* 指针不能指向 const char 数据),则 ch 的地址存储在 chh 指针。

语句 chh[100]="hh"未定义的行为chh 指向ch,它存储在调用线程的堆栈中。 chh 不是指向 101+ char* 指针数组的指针,因此索引到 chh 的第 100 个槽是非法的(仅索引 0是有效的,因为所有变量都可以视为 1 个元素的数组)。此代码正在进入您不拥有的堆栈内存,并将 "hh" 的地址写入 chh 的第 100 个槽正在破坏该堆栈上的随机内存(如果它没有因 AccessViolation/SegFault 而彻底崩溃)。

关于c++ - 内存分配如何在指向 char 的双指针中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63584542/

相关文章:

c# - 枚举、重叠值、C#

c++ - fftwpp 在卷积后创建一个零填充数组

java - 什么是 "typing models"?

c++ - 三重嵌套 For 循环的时间复杂度,其中索引相互依赖

c++ - 如何在 C++ 中为不同的迭代器 value_types 重载函数

c++ - 静态成员函数中的 `this` 类型?

c++ - 如何将 vector 的STL vector 转换为 Armadillo 垫?

C++ 设置 "blank"或重置 ifstrean (ios) 的异常掩码

c++ - 如何获取其他命令行界面程序的输出?

c++ - OpenGL 形状不渲染