c - 'char' 指针的奇怪行为

标签 c

当我声明并运行以下命令时,它会给我一个 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/

相关文章:

c - 为什么我使用 strncpy 复制的字符串有垃圾而不是最后一个字符?

将大端 MIPS 转换为 C

c - C语言可以显示数组吗?

java - 如何检测后台服务或 Android native 环境中的音量按钮单击?

c - 为什么要在 C 的字符串输入中使用 int 类型的变量?

c - 获取我的宏旁边的标签 inf 一个 C 代码

c - 我无法理解这种类型转换

c - 到矩阵中的点的路径。想通过DP解决

c++ - 否定 float 总是安全的吗

c - 如何在vim中仅用一个制表符自动缩进分割线?