所以我最近在查看某人的代码,我看到编译器没有抱怨,也没有任何运行时错误,如下所示:
const char *p = "I didn't malloc...";
上面的代码有效,但我想知道如何。这就是我认为正在发生的事情。有人可以确认吗?
所以“我没有malloc ...”在编译时在堆栈上静态分配,并将其地址传递给指针p。类似于静态数组的分配方式。我90%肯定这一点,但一些确认会有所帮助。
感谢。
答案 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