从struct打印char指针时的奇怪输出

时间:2011-11-26 16:39:34

标签: c++

以下是代码:

#include<iostream>

struct element{
    char *ch;
    int j;
    element* next;
};

int main(){
   char x='a';
   element*e = new element;
   e->ch= &x; 
   std::cout<<e->ch; // cout can print char* , in this case I think it's printing 4 bytes dereferenced 
}
我看到一些未定义的行为吗? 0_o。任何人都可以帮助我发生什么事吗?

3 个答案:

答案 0 :(得分:4)

您必须取消引用指针才能打印单个字符:std::cout << *e->ch << std::endl

否则,您正在调用<<的{​​{1}}重载,它执行完全不同的操作(它需要一个指向以null结尾的字符数组的指针)。

编辑:回答有关UB的问题:输出操作执行无效指针解除引用(假设char *指向更长的数组字符),触发未定义的行为。

答案 1 :(得分:1)

它将打印'a'后跟垃圾,直到它找到终止0.您将char类型(单个字符)与char *混淆,这是一个需要以空值终止的C风格字符串。

请注意,您可能实际上看不到'a'被打印出来,因为它后面可能跟一个退格符。事实上,如果你在Linux上用g ++编译它,那么很可能会有一个退格。

答案 2 :(得分:0)

这是null问题。

C和C ++中的字符串以空字符结尾。 x是一个字符,但不是字符串。你试图把它做成一个。