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

C语言中指针未更新指向地址且无法显示正确值的原因是什么

错误原因分析

你的代码存在两个核心错误:

  • scanf传入参数逻辑错误
    你想修改的是指针变量p本身存储的地址值,而非p当前指向的内存中的值。你写的scanf("%X", *p)会把p当前指向的number1的值100作为内存地址传给scanf,程序会尝试把输入的十六进制数写入内存地址0x64的位置,属于非法内存访问,不仅完全修改不了p的指向,还大概率会触发程序崩溃。
    正确的做法是传入指针变量p自身的地址,这样scanf才能把输入的地址写入p的存储单元,实现修改指向的效果。
  • 地址格式化符使用错误
    %X是对应unsigned int类型的格式化符,而指针的长度在不同系统架构下和int不一定匹配(比如64位系统下指针占8字节,int仅占4字节),用%X读写地址会发生截断,导致地址错误。
    正确的做法是使用专门针对指针的格式化符%p。
修正后可运行的代码
#include <stdio.h>

int main()
{
  int number1 = 100;
  int number2 = 200;
  int *p = &number1;

  printf("Number 1 Value: %d \n", number1);
  printf("Number 1 Address: %p \n\n", (void*)&number1);

  printf("Number 2 Value: %d \n", number2);
  printf("Number 2 Address: %p \n\n", (void*)&number2);

  printf("Pointer Number 1 Value: %d \n\n", *p);

  printf("Enter Number 2's Address to view it's value: ");
  // 用%p读取地址,传入p自身的地址
  scanf("%p", &p);

  printf("\nPointer Value: %d\n\n", *p);

  return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 04:12:01