提问者:小点点

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


我愿意

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';

然后造成分割断层,这背后的道理是什么?


共3个答案

匿名用户

'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 *char_ptr = 'c'; 

这是一个指针,它需要指向一个地址

匿名用户

赋值char*char_ptr=addr将指针char_ptr指向内存地址addr。在您的示例中,