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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 00:48:31