*a++ = *b++的含义、运行机制及相关代码段错误问询
问题解析:
*a++ = *b++的含义与代码段错误原因 一、*a++ = *b++的运行逻辑
后置++运算符优先级高于解引用*,但后置++的特性是先使用当前值,再执行自增操作。这条语句的执行步骤可拆解为:
- 读取指针
b当前指向地址的内容(即*b); - 将该值赋值给指针
a当前指向地址的内容(即*a); - 指针
a自增(因是int*类型,自增步长为sizeof(int),指向当前位置的下一个int内存单元); - 指针
b完成同样的自增操作。
简单说就是:把b指向的内容拷贝到a指向的位置,之后两个指针都向后移动一个int的内存长度。
二、给定代码的问题分析
先看代码里的指针初始化:
int *a = 0; // 指针a被赋值为NULL(空指针,指向地址0) int *b = 3; // 指针b被赋值为地址3,属于非法内存区域
在C语言中,空指针(地址0)和地址3都不属于程序有权限访问的内存空间。当执行*a++ = *b++时,第一步就要访问*b(地址3的内容),这会触发操作系统的内存保护机制,直接抛出segmentation fault(段错误)。
由于程序在执行赋值语句时就已崩溃,后续的printf语句根本不会运行,也就不存在所谓的变量a、b最终输出值。
如果要让代码合法运行,需让指针指向程序拥有权限的内存(比如栈上的变量):
#include <stdio.h> int main() { int val_a = 0, val_b = 100; int *a = &val_a; int *b = &val_b; *a++ = *b++; printf("a的地址值:%p\n", a); printf("b的地址值:%p\n", b); printf("val_a的值:%d\n", val_a); return 0; }
这段代码执行后,val_a会被赋值为100,a和b会分别指向val_a和val_b之后的内存地址,不会出现段错误。
内容的提问来源于stack exchange,提问作者YellowKing0907
相关产品推荐
相关产品推荐

