gpt4 book ai didi

C执行栈——局部变量分配

转载 作者:太空狗 更新时间:2023-10-29 15:18:17 25 4
gpt4 key购买 nike

我有一个非常基本的问题。让我们看一下这个片段:

#include <stdio.h>

void foo(void) {
char *s = "StackOverflow";
printf("%s\n", s);
}

int main(void) {
foo();
}

在进程执行栈中,main 被加载到栈中,然后 foo() 被调用。现在,“StackOverflow”的内存分配在哪里?同样,当调用 printf 时,"%s\n"的内存分配在哪里?


考虑以下代码:

现在我的另一个问题是,考虑以下代码:

#include <stdio.h>

int x;
int abc = 100;

void foo(void) {
char *s = "stackoverflow";
printf("%s\n", s);
}

int main(void) {
foo();
}

所以,如果我执行 objdump -s -j .bss a.out ,我应该看到未初始化的段,如果我执行 objdump -s -j .data a.out ,我应该看到初始化的段 (abc=100) rt ?这个假设有什么问题吗?

虽然我得到以下输出:

测试> objdump -s -j .bss a.outa.out: 文件格式elf32-i386

测试> objdump -s -j .data a.out

a.out: 文件格式elf32-i386

.data 部分的内容: 804954c 00000000 3c960408 00000000 64000000 ....<......d...

我在这里错过了什么?

再次感谢大家

最佳答案

"StackOverflow""%s\n" 字符串文字在大多数系统中都放在 .rodata (只读数据)部分.

在 UNIX 上,您可以使用 objdump 命令转储 .rodata 部分:

$ gcc tst.c 
$ objdump -s -j .rodata a.out

@FatalError 添加在注释中,"%s\n" 在示例中对于 objdump 不可见,因为 gcc 优化了对 printf("%s\n", str) 通过调用 puts(str) 替换它。

要在 objdump 输出中查看 "%s\n" 字符串文字,您可以使用 gcc -fno-builtin 编译您的程序。

关于C执行栈——局部变量分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9933980/

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