gpt4 book ai didi

c - 这两种代码有什么区别?

转载 作者:太空宇宙 更新时间:2023-11-04 05:21:39 25 4
gpt4 key购买 nike

这里有两种具有相同输出的代码片段。

char *p = "abc";
::printf("%s",p);

::printf("%s","abc");

“abc”字符串在内存中的存储位置有什么不同吗?

我曾经听说在第二个代码中,“abc”字符串被编译器放在只读内存中(.text 部分?)

如果有的话,如何从代码中分辨出这种区别?

非常感谢。

更新

我目前的理解是:

当我们写的时候:

char *p="abc"

虽然这看起来只是一个声明性语句,但实际上编译器会生成许多命令式指令为了它。这些指令将在包含方法的堆栈帧中分配适当的空间,它可能是这样的:

subl %esp, $4

然后“abc”字符串的地址被移动到分配的空间,它可能是这样的:

movl $abc_string_address, -4(%ebp)

“abc”字符串存储在可执行文件镜像中。但是它(我的意思是字符串)将被加载到内存中的什么位置完全取决于编译器/链接器的实现,如果它被加载到进程地址空间的只读部分(即内存页的保护位被标记为只读),那么p是一个只读指针,如果它被加载到r/w部分,p是可写的。

如果我错了请纠正我。现在我正在查看 gcc 生成的汇编代码以确认我的理解。我将很快再次更新此线程。

最佳答案

Is there any difference as to where the "abc" string is stored in memory?

不,两者都是如此。字符串文字存储在只读段中。但是,如果您将变量声明为 char[],它将被复制到堆栈上,即,不是只读的。

关于c - 这两种代码有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4160943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com