使用指针交换整数时触发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
相关产品推荐
相关产品推荐

