我做
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';
然后它会导致分段错误。这背后的原因是什么?
答案 0 :(得分:4)
'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';
答案 1 :(得分:0)
char *char_ptr = 'c';
这是一个指针,它需要指向一个与& ch相同的地址。
答案 2 :(得分:0)
作业char *char_ptr = addr
会将指针char_ptr
指向内存地址addr
。
在您的示例中,&ch
是ch
的地址,而'c'
只是char
值,因此不是有效的内存地址。