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
相关产品推荐
相关产品推荐

