Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这行代码是如何工作的?_C++_C_Memory_Pointers - Fatal编程技术网

C++ 这行代码是如何工作的?

C++ 这行代码是如何工作的?,c++,c,memory,pointers,C++,C,Memory,Pointers,因此,我最近查看了一些人的代码,我发现编译器没有抱怨,也没有以下任何运行时错误: const char *p = "I didn't malloc..."; 上面的代码可以工作,但我想知道如何工作。以下是我认为正在发生的事情。有人能确认一下吗 因此,“我没有malloc…”在编译时在堆栈上被静态分配,其地址被传递给指针p。类似于静态数组的分配方式。我90%肯定这一点,但一些确认会有所帮助 谢谢。这是字符串文字。该标准不知道“堆栈”、“堆”等——这些是实现细节。所以没有“标准”位置 但是通常它不

因此,我最近查看了一些人的代码,我发现编译器没有抱怨,也没有以下任何运行时错误:

const char *p = "I didn't malloc...";
上面的代码可以工作,但我想知道如何工作。以下是我认为正在发生的事情。有人能确认一下吗

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


谢谢。

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


但是通常它不在堆栈上。它位于名为
text
的只读区域中。而且它与“静态数组的分配方式”不同。

内存也是以只读方式分配的。任何更改*p的尝试都是未定义的。

虽然通常不在堆栈上,但它将是可执行文件的数据段的一部分。

您有一个字符串literal
“我没有malloc…”
位于只读内存中的某个位置(正好是实现定义的位置),指针指向该位置

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

实际上,在C++中,声明像你一样声明字符串文字是不礼貌的。 因此,在C++中,应该使用< <代码> const <代码>限定符,如:

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

字符串literal
“我没有malloc…”
存储在数据段的只读区域中,并且
p
包含该位置的地址。

p将指向将在堆栈上分配的只读内存区域。 此外,编译器将自动以null终止字符串,并在末尾添加“\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;
}

你在用什么编译器?符合要求的编译器应拒绝此操作。
p
的类型应为
char const*
,因为该数据段(“通常”)不可写,所以大多数编译器最近都会发出警告。@Dani不,他们不应该这样做。这是完全正常的标准C和C++。@字符串Cnuturar:字符串文字应该是代码> const char */COD>,所以这行应该是一个错误:<代码>赋值丢弃限定符< /C> >。@ DANI:不在C++ 03中,并且在有自动转换从<代码> char const *//>到<代码> char */COD>(允许与C的向后可比性)。我认为这在C++11中被弃用了。但大多数编译器都会产生警告。Unix上名为
data
的区域不是只读的。现在,只读数据通常在
文本中,不是吗?@JonathanLeffler你当然是对的<代码>数据
用于可写的初始化内容。
Last char: 8 hex: 38

Last char + 1:  hex: 0