当我声明并运行以下命令时,它会给我一个 segmentation fault .
main()
{
char *p = "boa";
*(p+1) = 'y';
printf("%s",p);
}
我怀疑 char *p
是一个常量,等等
但以下工作正常。
main()
{
int i = 300;
char *p = (char*)&i;
*(p+1) = 'y';
printf("%s",p);
}
这背后的原因是什么?上述规则不也适用于此吗?
最佳答案
这取决于您对“工作正常”的定义。但赋值没有出现段错误的原因是因为 p
指向了 i
变量的地址,这显然不是常量。 i
被赋予了一个常数值,但 i
本身不是一个常数。
对于 i = 300
(假设小端 x86 ):
+--+--+--+--+
i:|2c|01|00|00|
+--+--+--+--+
.
/|\
|
p:&i
在 *(p+1) = 'y'
之后
+--+--+--+--+
i:|2c|79|00|00|
+--+--+--+--+
.
/|\
|
p:&i
因此,print 语句恰好为您打印 ,y
,但这只是因为您依赖于平台的字节顺序(并且 2c
是可打印的 ASCII 字符).在大端机器上和/或如果它是非 ASCII,情况可能会有所不同。
关于c - 'char' 指针的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11699479/