在特定情况下取消引用指针

时间:2019-05-31 03:34:31

标签: c

谁能告诉我为什么这段代码不起作用?总是说分割错误

int main()
{
    int a = 10;
    int b = (int)&a;
    int *c = (int*)b;
    printf("%d", *c);

    return 0;
}

当我打印c的值时,它的地址a就像我期望的那样,但是当遵循它的值时,就会发生分段错误。假设这是一个32位编译器

2 个答案:

答案 0 :(得分:3)

a是一个整数,其值是10。

{b是一个int,并将一个a的地址转换为int作为值。

c是一个指向int的指针,并将值b强制转换为一个指向int的指针。

b的值是a的地址,但强制转换为整数。

因此,c“应该”指向a,并且使用*c,您“应该”得到10。问题是,在您的计算机上,int的大小和a pointer to an int的大小不相同,在第一个强制转换中,您将&a的值截断以适合int的大小,并丢失了地址的一些数字。

现在b中有一个int仅包含a地址的某个数字,因此是一个完全不同的地址,因此,当您尝试访问该地址处的内存时(使用{{1 }})您没有访问*c,但是其他地方的某些内存在这种情况下恰好是无效的。

答案 1 :(得分:2)

有时它可以工作,有时不起作用,这取决于您的计算机,也许 integer 的大小小于计算机中 pointer 的大小,所以如果强制转换并分配给整数的地址大于int的大小,它将溢出并且整数将保存错误的地址,因此输出将给出分段错误。


注意


您可以使用 sizeof 函数检查类型的大小。

const regex = /^.+Ave\s+(.+?)[,\s]+?[A-Z]{2}.+$/gm;
const str = `59 W Grand Ave Chicago, IL 60654
59 E Grand Hotel Ave Chicago IL 60654
59 E George Washington Ave New York, NY 60654
59 E George Washington Ave San Diego CA 60654
59 E George Washington Ave St. Petersburg, CA 60654`;
const subst = `$1`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log(result);
相关问题