【发布时间】:2016-10-25 15:29:54
【问题描述】:
int main(int argc, char **argv) {
unsigned int ptr1 = *((unsigned int *)(argv[1]));
printf("ptr1 = 0x%x\n", ptr1);
exit(0);
}
这是视频教程中的代码 sn-p。我不确定我是否理解为什么代码在运行时不会导致分段错误。
(unsigned int *)(argv[1]) 这看起来像传递给程序的第一个参数被强制转换为无符号整数。因此,如果参数是“AAAA”,那么“0x41414141”现在是指向内存中某个位置的指针。
然后当我们这样做时 - *((unsigned int *)(argv[1])),我们不是在推迟地址 0x41414141 指向的值吗?据我所知,该进程可能无法访问此地址。那么为什么没有出现分段错误呢?程序的输出是 -
ptr1 = 0x41414141
我已经用 gcc 在 Linux 上编译了这个程序。
【问题讨论】:
-
argv[1]持有指向char数据的指针,您将该指针(而不是它指向的内容)转换为指向unsigned int数据的指针,然后取消引用 that。您没有取消引用0x41414141。您正在取消引用argv[0],但要使用unsigned int *有色眼镜。
标签: c pointers casting dereference