c - 与取消引用 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]
0x200000000
0x7fffffffece5
"hello"
解决方案
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
推荐阅读
- c# - 无法检测到右键单击鼠标向下和向上事件
- go - 为什么 go module 伪版本有特定版本?
- python - 下载时 Gdrive API 未检测到所选文件夹中的所有文件
- java - 在 Java 中使用 Reactor Webclient 的代理配置返回 405 Method not allowed
- blockchain - 使用 Truffle 部署合约的 53 位问题
- cuda - 从 __host__ __device__ 函数调用 __host__ 函数
- .net - 有没有办法用 C# .net core 编辑 pdf?
- asp.net-core - .NET CORE WEB API 接受整数列表作为 HTTP GET API 中的输入参数
- r - 如何使用包括(非促销和促销)销售的销售数据创建基线预测?
- angular - 如何在具有动态 id 角度 8 的相同组件上重新路由