#include <iostream>
using namespace std;
int main() {
int * a[5];
char * b[5];
cout<<a[1]; // this works and prints address being held by second element in the array
cout<<b[1]; // this gives run time error . why ?
return 0;
}
任何人都可以向我解释cout<<b[1]
给出运行时错误吗?
int和char数组的行为是否应该相似?
答案 0 :(得分:6)
因为IOStreams专门用于处理char*
。
char*
通常指向一个C字符串,所以IOStreams只会假设他们这样做并取消引用它们。
你的不是。
答案 1 :(得分:3)
正如其他人所说,iostream格式化输出操作符会将char*
视为指向C风格的字符串并尝试访问此字符串。
其他人到目前为止还没有说过,如果你对指针感兴趣,你需要将指针转换为void*
。例如:
std::cout << static_cast<const void*>(buf[1]);
答案 2 :(得分:2)
C ++(从C继承)专门处理字符指针。当您尝试打印a[1]
类型int*
时,将打印该地址。但是,当您尝试打印b[1]
类型为char*
的iostream库时 - 遵循其余语言 - 假设指针指向以零结尾的字符串的第一个字符。您的输出语句都是初始化行为,但在char*
崩溃的情况下更可能因为指针被解除引用。
答案 3 :(得分:2)
cout等输出流特别考虑了char *,它没有给其他指针。对于除char *之外的指针,它只是将指针的值打印为十六进制地址。但对于char *,它将尝试打印出char *引用的C风格(即空终止的char数组)字符串。因此,它会尝试取消引用char指针,因为@AlexD在评论中指向你的帖子。