char指针在两种不同的情况下表现不同

时间:2013-10-30 03:36:56

标签: 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';

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

3 个答案:

答案 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。 在您的示例中,&chch的地址,而'c'只是char值,因此不是有效的内存地址。