首页 > 解决方案 > 与取消引用 argv 混淆

问题描述

我有这个小程序:

#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[]) {
   printf("argv[1] -> %s\n", argv[1]); 
}

gdb使用以下命令对其进行了分析:

$ gdb -q  --args foo hello
Reading symbols from foo...
(gdb) break main
Breakpoint 1 at 0x1148: file foo.c, line 5.
(gdb) run
Starting program: /tmp/foo/foo hello

Breakpoint 1, main (argc=2, argv=0x7fffffffea68) at foo.c:5
5          printf("argv[1] -> %s\n", argv[1]);
(gdb) print argv@2
$1 = {0x7fffffffea68, 0x200000000}
(gdb) print *argv@2
$2 = {0x7fffffffecd8 "/tmp/foo/foo", 0x7fffffffece5 "hello"}

我不明白当is 而不是string 的实际地址时如何产生argv[1]字符串。"hello"argv[1]0x2000000000x7fffffffece5"hello"

标签: cconsole-applicationargv

解决方案


print argv@2不做你认为它做的事。它似乎打印了 and ,argv[0]而不是打印and 。argv[1](&argv)[0](&argv)[1]

这是我尝试调试程序时得到的结果:

(gdb) p argv
$1 = (char **) 0x7fffffffecd8
(gdb) p argv[0]
$2 = 0x7fffffffeeb8 "/home/a.out"
(gdb) p argv[1]
$3 = 0x0
(gdb) p argv@2
$4 = {0x7fffffffecd8, 0x100000000}
(gdb) p (&argv)[1]
$5 = (char **) 0x100000000

推荐阅读