You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言指针学习疑问:%p与%u输出地址为何出现异常?

解答你的C语言指针格式化与地址变化问题

1. 用%u输出地址时的警告和不稳定输出原因

  • %u是用于输出**无符号整数(unsigned int)**的格式化说明符,但变量的地址属于指针类型(本质是void*),两者类型不匹配。
  • 在不同架构的系统中,指针的大小可能和unsigned int不同:比如64位系统下,指针占8字节,而unsigned int通常只占4字节。用%u输出指针时,会强行截断指针的高位字节,这不仅会触发编译器的类型不匹配警告,截断后的值也会丢失有效信息,导致输出结果看起来“不稳定”。
  • 记住:输出指针/地址永远要用%p格式化符,它会自动适配当前系统的指针大小和标准格式。

2. %p输出的地址每次运行都变化的原因

这是现代操作系统的**地址空间布局随机化(ASLR)**机制导致的:

  • 为了提升系统安全性,操作系统每次启动你的程序时,都会随机分配进程的内存空间位置,包括变量i、指针j这些数据的存储地址。
  • 这种随机化可以避免恶意程序通过固定内存地址进行攻击,所以每次运行代码时地址都会变化,这是正常的安全机制,不是你的代码有问题。

3. 代码里的小修正

你代码中第二个printf的描述有误,应该是输出指针j的地址,而非i的:

#include<stdio.h>
int main()
{
    int i=3;
    int *j;
    j=&i;
    printf("Address of i= %p\n",&i);
    printf("Address of j=%p\n",&j); // 这里把i改成j才正确
}

内容的提问来源于stack exchange,提问作者Harshal Malani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:55:01