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

使用指针交换整数时触发Segmentation fault(段错误)求助

问题根源

你的代码核心错误是指针没有指向有效的内存空间:

  • int *a; 和 int *b; 定义的是指针变量,它们的作用是存储内存地址,而非直接存储整数数值。
  • 直接执行 a = 3; b = 5;,是把内存地址0x3和0x5赋值给指针,这两个地址属于程序没有访问权限的内存区域,后续访问*a、*b时必然触发段错误。
正确实现方式

方式一:让指针指向实际的整数变量

先定义普通整数变量,再让指针指向它们的地址,之后通过指针操作变量的值:

#include <stdio.h>

int main()
{
    int num1 = 3;
    int num2 = 5;
    int *a = &num1;  // 让指针a指向num1的地址
    int *b = &num2;  // 让指针b指向num2的地址
    int temp;        // 临时变量存储中间值

    temp = *a;       // 把a指向的变量值(num1)存入temp
    *a = *b;         // 把b指向的变量值(num2)赋值给a指向的变量
    *b = temp;       // 把temp的值赋值给b指向的变量

    printf("num1=%d\n num2=%d\n", num1, num2);
    // 也可通过指针访问输出:printf("*a=%d\n *b=%d\n", *a, *b);
    return 0;
}

方式二:封装成函数(指针传参实现交换)

如果是想练习指针的函数传参,把交换逻辑封装成函数,需传入变量的地址:

#include <stdio.h>

void swap(int *x, int *y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}

int main()
{
    int num1 = 3;
    int num2 = 5;

    swap(&num1, &num2);  // 传入变量的地址

    printf("num1=%d\n num2=%d\n", num1, num2);
    return 0;
}
关键注意点
  • 指针必须先指向已分配的有效内存(比如普通变量的地址、malloc分配的堆内存),才能通过*指针的方式访问或修改内存中的值。
  • 普通场景下绝对禁止直接给指针赋值整数(除非是明确合法的硬件寄存器地址这类特殊场景)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:20:45