这行代码如何工作?

时间:2011-12-10 17:21:48

标签: c++ c memory pointers

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

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

上面的代码有效,但我想知道如何。这就是我认为正在发生的事情。有人可以确认吗?

所以“我没有malloc ...”在编译时在堆栈上静态分配,并将其地址传递给指针p。类似于静态数组的分配方式。我90%肯定这一点,但一些确认会有所帮助。

感谢。

5 个答案:

答案 0 :(得分:8)

您有一个字符串文字"I didn't malloc..."位于只读内存中的某个位置(确切地说是实现定义的位置),指针p指向该位置。

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

事实上在C ++中,不推荐像你一样声明一个字符串文字 所以在C ++中你应该有一个const限定符,如:

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

答案 1 :(得分:7)

这是一个字符串文字。标准不知道“堆栈”,“堆”等 - 这些是实现细节。所以没有“标准”位置。

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

答案 2 :(得分:5)

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

的数据段的一部分

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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

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

#include <stdio.h>

int main(int argc, const char *argv[])
{
    char *p = "AString8";
    printf("%s\n", p);
    printf("Last char: %c hex: %x\n", p[7], p[7]);
    printf("Last char + 1: %c hex: %x\n", p[8], p[8]);
    return 0;
}

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

节目输出:

Last char: 8 hex: 38

Last char + 1:  hex: 0