以下是代码:
#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。任何人都可以帮助我发生什么事吗?
答案 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是一个字符,但不是字符串。你试图把它做成一个。