gpt4 book ai didi

c - 内存在变量赋值之前不包含垃圾

转载 作者:IT王子 更新时间:2023-10-29 01:06:07 24 4
gpt4 key购买 nike

我有一个简单的 C 程序:

#include <stdio.h>

int main()
{
int i;
for(i = 0; i < 10; i++)
printf("Hello\n");

return 0;
}

我使用 gcc 编译它:

gcc -g test.c

然后我运行调试器:

gdb -q ./a.out

我在 main 设置断点并运行:

(gdb) break main
(gdb) run

然后我让它运行直到遇到断点,并尝试在 rip 当前指向的地址显示汇编指令:

(gdb) x/i $rip
=> 0x400538 <main+8>: mov DWORD PTR [rbp-0x4],0x0

看起来下一条指令将用值 0 初始化我的局部变量 i。因为它还没有执行指令,我希望那里有一个垃圾值。

(gdb) x/4xb $rbp-4
0x7fffffffe0ec: 0x00 0x00 0x00 0x00

它看起来不像垃圾值,看起来一切都已经清零了。断点应在执行 main 中的任何代码之前停止程序。

我在这里错过了什么?在初始化局部变量 i 之前,该内存位置不应该包含随机垃圾值吗?

最佳答案

It doesn't look like garbage values, it looks like everything has already been zero'd out.

我修改了您的示例以表明这只是一个巧合。

#include <stdio.h>

int main()
{
int i1;
int i2;
int i3;
int i4;
int i5;
int i6;
int i;

for(i = 0; i < 10; i++)
printf("Hello\n");

return 0;
}
(gdb) start
Temporary breakpoint 1 at 0x4005ac: file main.cpp, line 13.
Starting program: /home/a.out

Temporary breakpoint 1, main () at main.cpp:13
13 for(i = 0; i < 10; i++)
(gdb) info locals
i1 = 0
i3 = 0
i5 = 32767
i = 0
i2 = 4195520
i4 = -7856
i6 = 0

你看,不同的值是可能的。

对于您的示例,此地址的值在到达 main() 之前至少更改两次。只需为该地址设置 watch,您就会看到它在 main() 之前调用的函数中发生了变化:

(gdb) watch *(int*)0x7fffffffe06c
Hardware watchpoint 1: *(int*)0x7fffffffe06c

(gdb) r
Starting program: /home/a.out
Hardware watchpoint 1: *(int*)0x7fffffffe06c

Old value = 0
New value = 58
0x0000003a1d890880 in handle_intel () from /lib64/libc.so.6


Hardware watchpoint 1: *(int*)0x7fffffffe06c

Old value = 58
New value = 0
0x0000003a1d0146fd in _dl_runtime_resolve () from /lib64/ld-linux-x86-64.so.2

Hardware watchpoint 1: *(int*)0x7fffffffe06c

Old value = 0
New value = 1
0x00000000004005c3 in main () at main.cpp:7
7 for(i = 0; i < 10; i++)
#0 0x00000000004005c3 in main () at main.cpp:7

关于c - 内存在变量赋值之前不包含垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25158349/

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