当指针引用值为零时,为什么指针为空?

3
在C++中操作指针。我遇到了一些意想不到的情况。这是我的代码:
```cpp ```
int main(){
  char p=0;
  char* ptr=&p;
  cout<<"This is the pointer: "<<ptr;
return 0;
}  

当我运行此代码时,ptr的输出为空。如果我将p的值更改为任何其他值,它似乎会输出一个随机指针,例如值在不同运行之间更改,这是我所期望的。那么问题是将char值分配为0有什么不同。
额外信息:使用g++ 4.8.4编译。

4
当你将指针从0更改时,我不相信你真正看到了一个随机指针,我认为你可能看到了来自堆栈的随机数据。cout会将char*视为以字符p开头的空终止字符串。当第一个字符是'\0'时,它就是一个空字符串。 - jmc
具体来说,(char)0(数字转换为字符,通常是其ASCII值)与'0'(ASCII字符零,十进制48)不同于"0"(一个包含ASCII零和空终止符的匿名字符串)。 - Mr. Llama
4个回答

3
char p=0;

您的变量被定义为字符并分配了一个整数值0,因此在变量p上内部分配了一个空终止字符。

如果您按照以下方式更正上述语句并打印更多细节,可能会更清楚。

char p='0'; 

std::cout<<"This is the pointer: "<<&ptr<<" ---"<<*ptr <<"----"<<ptr;

&&ptr- > 获取ptr的地址

*ptr-> 获取分配给ptr的值

ptr-> 从ptr获取字符串,直到它看到一个空终止字符,所以期望输出垃圾值。

Demo:http://coliru.stacked-crooked.com/a/2d134412490ca59a


这是最清晰的答案。只需注意@jmc对问题的评论,其中最简洁地解释了为什么我使用我的问题中的原始代码看到空字符串被打印。 - quantomb

0

你的指针指向一个值为零的字符。

这个指针是完全有效的。

cout正在打印一个长度为零的字符串。


0
char p = 0;
char* ptr=&p;

这里的ptr是一个指向零长度字符串的指针。因为它是一个char*指针,它指向一个被认为是字符串结尾的零(\0)。


0
程序在 p 未设置为0的情况下具有未定义行为。为使其规范,请编写
int main(){
  char p=0;
  char* ptr=&p;
  cout<<"This is the character: ";
  //             ^^^^^^^^^^^^^^                 
  cout.write( ptr, 1 );
return 0;
}  

或者

int main(){
  char p=0;
  char* ptr=&p;
  cout<<"This is the pointer: "<<( const void * )ptr;
return 0;
}  

否则,这个语句
  cout<<"This is the pointer: "<< ptr;

当p设置为0时,仅输出空字符串。在其他情况下,它将在字符p之后输出一些垃圾,直到遇到零字符。

另一种方法可能看起来像

int main(){
  char p[2]= { 0 };
  char* ptr=&p;
  cout<<"This is the pointer: "<< ptr;
return 0;
}  

这个语句

cout<<"This is the pointer: "<< ptr;

输出指针ptr指向的字符串。一个字符串是以零字符结尾的字符序列。因此,您应该定义一个至少有两个字符的字符数组,其中第二个字符将始终设置为0。


7
不是未定义行为,他只是打印了一个零长度的字符串。 - Matteo Italia
@Matteo Italia 我的意思是他改变了p中的值。 - Vlad from Moscow
1
也许你应该更清楚地表明(指定对于char *,相关的operator<<重载期望一个以空字符结尾的字符串,并且在这种情况下它之所以起作用是“偶然”的,因为blah blah blah)。 - Matteo Italia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接