char 指针在两种不同情况下的行为不同

标签 c pointers

我愿意

char ch = 'c';

然后

char *char_ptr = &ch;
*(char_ptr+1) = 'h';
*(char_ptr+2) = '\0';

当我使用

打印它时,它可以正常工作
printf("char_ptr as string = %s\n", char_ptr);

但是当我这样做的时候

char *char_ptr = 'c';
*(char_ptr+1) = 'h';
*(char_ptr+2) = '\0';

然后它会导致段错误。这背后的原因是什么?

最佳答案

'c' 是一个整数常量,在 ASCII 系统下,其计算结果为 0x63

那个,以及紧随其后的地址,几乎肯定会成为开始向其中插入信息的无效地址。

事实上,即使是第一个也是未定义的行为,因为 ch 只分配了一个字符,而您正试图更改超出该字符的信息。它可能的工作取决于您的编译器如何布局内存和堆栈帧,但这仍然是一个非常糟糕的主意。

更正确的做法是:

char char_ptr[3] = "c";    // Allocate three bytes to ensure room.
*(char_ptr+1) = 'h';       // or char_ptr[1] = 'h';
*(char_ptr+2) = '\0';      // or char_ptr[2] = '\0';

关于char 指针在两种不同情况下的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19673378/

相关文章:

C 指针 - 不同的地址

c - Arm Cortex架构中的局部变量是存储在寄存器还是堆栈中?

c - 给定范围内的素数

创建动态字符数组

c++ - 从模板参数指向方法的指针

Delphi 内存泄漏,指向 TStringList 的指针

c++ - Visual Studio 2010 和 MinGW

c - Linux PCI 驱动程序设置和拆卸

c++ - 它有什么作用*((T**)m_ptr)?

c - 在c中存储unsigned char数组的数组