我愿意
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 *char_ptr = 'c';
这是一个指针,它需要指向一个地址
赋值char*char_ptr=addr
将指针char_ptr
指向内存地址addr
。在您的示例中,