这行代码是如何工作的
How does this line of code work?
所以我最近在看别人的代码,我看到编译器没有抱怨,也没有任何运行时错误与以下:
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
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- sdl软件渲染器不工作,工作在硬件加速的一个