gle*_*096 4 c pointers segmentation-fault
在C中,为什么X和Y工作但不是Z?
//X
int num = 5;
int *ptr;
ptr = #
//Y
int *mptr = (int *)malloc(sizeof(int *));
*mptr = 5;
//Z
int* myptr;
*myptr = 5;
Run Code Online (Sandbox Code Playgroud)
在Z中,我声明一个指针,并尝试使其指向一个数字,但我得到一个分段错误.但在我看来,我在Z和X和Y做同样的事情.在XI中直接使用变量num而不是数字5,而在YI中只使用堆来保存变量而不是堆栈.那么X和Y怎么工作但是Z没有?
//X
int num = 5;
int *ptr;
ptr = #
Run Code Online (Sandbox Code Playgroud)
对于上面的内容,int值"num"在堆栈或程序数据段中分配,因此它具有一个地址.让我们假装它是由编译器分配的地址0x12345678.你创建一个int*ptr.这也有地址让我们说0x20000000.该地址当前指向随机数据.我们想让0x20000000处的指针指向0x12345678处的数据值,这样我们就可以读取0x12345678的内容并返回值5 ...所以我们将0x12345678放在0x20000000的存储空间内(我们设置ptr =&num ).
//Z
int* myptr;
*myptr = 5;
Run Code Online (Sandbox Code Playgroud)
对于第二个示例,我们只有0x20000000(myptr).它是一个指针,它目前指向无处或任何地方.当我们执行*myptr = 5时,我们查看存储在0x20000000的地址.它是随机的,所以它可能是0xffff0000让我们使用那个例子.然后它会尝试将值5写入此地址(0xffff0000),该地址不存在并导致段错误.
因此,在上一个示例中,指针存在,但它并未指向任何有效位置,因此当您尝试写入指向的位置时,您要么损坏有效内存,要么导致段错误.