这行代码是如何工作的

How does this line of code work?

本文关键字:工作 何工作 代码      更新时间:2023-10-16

所以我最近在看别人的代码,我看到编译器没有抱怨,也没有任何运行时错误与以下:

const char *p = "I didn't malloc...";

上面的代码工作,但我想知道如何。这是我认为正在发生的事情。有人能证实一下吗?

所以"I didn't malloc…"在编译时在堆栈上静态分配,并将其地址传递给指针p。类似于静态数组的分配方式。我对此有90%的把握,但一些确认会有所帮助。

谢谢。

您有一个字符串文字"I didn't malloc..."位于只读内存的某个地方(正是实现定义的地方),它由指针p指向。

需要注意的重要一点是,任何改变这个字符串文字的尝试都会导致未定义行为

实际上在c++中不赞成像你这样声明字符串字面值。
因此,在c++中,您应该使用const限定符,如:

const char *p = "I didn't malloc...";

这是一个字符串字面值。标准不知道"栈"、"堆"等——这些是实现细节。所以没有"标准"的位置。

但是通常不在堆栈上。它位于一个名为text的只读区域。它不是"类似于静态数组的分配方式"。

内存也是只读的,任何改变*p的尝试都是未定义的。
通常不是在堆栈上,它是可执行文件

的数据段的一部分。

字符串文本"I didn't malloc..."存储在数据段的只读区域,p包含该位置的地址。

p将指向一个只读内存区域,该内存区域将在堆栈上分配。此外,编译器会自动终止字符串,并在字符串末尾添加一个''字节。

不使用const是危险的,实际上c++编译器会对以下代码发出警告:

#include <stdio.h>
int main(int argc, const char *argv[])
{
    char *p = "AString8";
    printf("%sn", p);
    printf("Last char: %c hex: %xn", p[7], p[7]);
    printf("Last char + 1: %c hex: %xn", p[8], p[8]);
    return 0;
}

警告:从字符串常量到' char* '的转换已弃用

程序输出:

Last char: 8 hex: 38
Last char + 1:  hex: 0