C语言 取消引用递增的指针,导致指针更改其值


#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int *x= 0;
    int y = 0;
    x = &y;
    *x = 1;
    printf("%in",x);//an address 
    printf("%in",*x);//1
    *(x+1)=10;
    printf("%in",x);//10 ---->unexpected
    printf("%in",x+1);//14 ---->more wierd
    printf("%in",*(x+1));//seg fault
    return 0;
}

在这种情况下,最后一个 printf 语句将输出一个 seg 错误。x 的值在 *(x+1)=10 后变为 10。但是,*(&y+1) 的值确实更改为 10。语句 *(x+1)=10 不应影响 x imo。

你对指针使用了错误的控制字符串 ( %i

printf("%in",x);//10 ---->unexpected

您应该改用%p

printf("%pn",(void*) x);

此外,对指针(x + 1)的访问也会导致未定义的行为,因为初始指针x指向单个整数,因此取消引用(x + 1)是越界和未定义的。

最新更新