谁能告诉我为什么这段代码不起作用?总是说分割错误
int main()
{
int a = 10;
int b = (int)&a;
int *c = (int*)b;
printf("%d", *c);
return 0;
}
当我打印c
的值时,它的地址a
就像我期望的那样,但是当遵循它的值时,就会发生分段错误。假设这是一个32位编译器
答案 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);