c - 使 7 年前的印刷品与现在兼容
问题描述
我正在阅读 The Art Of Exploitation 这本书,有一个名为的程序memory_segments.c
向我们演示了内存段、堆、堆栈等是如何工作的。但是当我尝试编译该程序时,似乎打印是'不更兼容现在。我使用gcc
10.2.0 来编译我的 C 代码。
#include <stdio.h>
#include <stdlib.h>
int global_initialized_var = 5;
int main()
{
printf("global_initialized_var is at address 0x%08x\n", &global_initialized_var);
// ... more prints, removed just to make code shorter
return 0;
}
// warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’
本书输出的作者:
...
global_initialized_var is at address 0x080497ec
...
什么是替代品0x%08x
?为什么0x%08x
不再工作?
解决方案
%x
打印整数值而不是指针。这是未定义的行为。要打印指针,请使用printf("%p", (void *)pointer);
- 转换指针时应使用的整数类型是
uintptr_t
或intptr_t
。对于指针之间的差异ptrdiff_t
- 要打印
uintptr_t
还是intptr_t
需要使用PRIdPTR PRIiPTR PRIoPTR PRIuPTR PRIxPTR PRIXPTR
printf 格式。例子:
uintptr_t p = SOME_VALUE;
printf("UINTPTR_T printed as hex: %" PRIxPTR "\n", p);
推荐阅读
- javascript - 一段时间后,Javascript setInterval“崩溃”?
- google-cloud-platform - gcp cloud shell 安装节点包出现空间不足错误
- python - 即使使用 Spyder 安装,也没有名为“folium”的模块
- javascript - Array() 构造函数中的 push 函数将其添加到所有元素
- websocket - NestJS websocket 客户端消息监听器
- github-pages - 如何设置 GitHub Pages root 重定向到 index.html 而不是 404?
- validation - 升级到 laravel 7 后验证中的空白屏幕
- python-3.x - 如何重塑数据框?
- matrix - 使用 Modelica integralExp 函数的 LTI 状态空间模型离散化不起作用
- html - djnago 中谷歌搜索的标签