C语言Swap函数内指针为何无法修改原值完成交换?
问题根因
所有异常都来自 类型不匹配的未定义行为:
- main函数中定义的
num1、num2是double类型(占8字节的双精度浮点数),传入swap函数的是double*类型的地址 - 但swap函数的形参定义为
float*(指向占4字节的单精度浮点数的指针),和传入的指针类型完全不兼容 - 函数内对
float*指针解引用时,只会从传入地址起始位置读取4字节,按照单精度浮点数的规则解析内存,和double类型8字节的存储规则完全不匹配,自然读不到正确的原始值,只会得到0这类错误结果,交换操作也不可能正常生效。
修正方案
保证全链路变量、指针、格式符的类型完全统一即可,修正后代码如下:
#include <stdio.h> void swap(double* p, double* q); int main() { double num1, num2; printf("Please write 2 numbers "); scanf("%lf %lf", &num1, &num2); swap(&num1, &num2); printf("\nnum1 is : %.2lf \n", num1); printf("num2 is : %.2lf \n", num2); return 0; } void swap(double* p, double* q){ double a; a = *p; *p = *q; *q = a; }
如果你需要交换float类型的变量,只需要把main里的num1、num2定义为float类型,同时将swap的形参改为float*、临时变量改为float、scanf的格式符改为%f即可,核心是所有关联位置的类型必须严格匹配。
补充说明
C语言的指针是强类型绑定的,指针指向的类型直接决定两个核心行为:
- 解引用时从起始地址读取多少长度的内存内容
- 按照什么编码规则解析读取到的内存字节
用不匹配的指针类型操作内存属于典型的未定义行为,轻则读错值、操作失效,重则导致内存越界、程序崩溃。
内容的提问来源于stack exchange,提问作者Luuaai
相关产品推荐
相关产品推荐

