【问题标题】:Pointer of a character in C++C++中的字符指针
【发布时间】:2016-10-11 13:54:39
【问题描述】:

按照书籍,第一行 cout 应该打印我存储 char 变量 b 的位置的地址,这似乎是 int 变量 a 也是。但是第一个 cout 语句打印出一个奇怪的 'dh^#' 而第二个语句正确打印一个十六进制值 ' ox23fd68'。为什么会这样?

 #include<iostream>
    using namespace std;

    int main()
    {
        char b='d';
        int a=10;
        char *c=new char[10];
        c=&b;
        int *e=&a;
        cout<<"c: "<<c<<endl;
        cout<<"e: "<<e;
    }

【问题讨论】:

  • 提示:“按书籍”应该"c: " 也打印地址吗?
  • 这不是一个坏问题,但可能在别处得到了回答。简短的回答是,C++ 继承了 C 对 char * 的处理方式,即“可能是可打印事物的集合”。
  • 你是从什么书里得到这个想法的?
  • 如果这是你的书教给你的,请把它扔掉,试试The Book List
  • 我更倾向于认为 OP 是按照书本行事,然后推断他们所学到的知识,却发现 char* 的处理方式与所有其他指针类型不同。对于那些在他们(开发人员)的一生中都见过 C 风格字符串的人来说,这可能很常见,这可以说是令人惊讶

标签: c++


【解决方案1】:

const char* 类型有一个非成员重载 operator<<(std::basic_ostream),它不写入地址,而是(假定的)C 样式字符串1)。在您的情况下,由于您分配了单个字符的地址,因此没有 NUL 终止符,因此没有有效的 C 样式字符串。代码显示undefined behavior

int* 的行为不同,因为没有对指向 int 的指针进行特殊处理,并且该语句按预期将地址写入流。

如果您想获取角色的地址,请使用static_cast

std::cout << static_cast<void*>( c ) << std::endl;


1)C 风格的字符串是一个字符序列,以 NUL 字符 ('\0') 结尾。

【讨论】:

    【解决方案2】:

    其实这个程序有问题。存在内存泄漏。

    char *c=new char[10];
    c=&b;
    

    这会在堆上分配 10 个字符,但是指向堆的指针会被变量 b 的地址覆盖。

    char*operator&lt;&lt; 写入cout 时,它被视为空终止的C 字符串。由于 b 的地址被初始化为包含d 的单个字符,op&lt;&lt; 继续在堆栈中搜索以找到第一个空字符。似乎它是在几个字符之后找到的,所以写了dh^#d 是变量b 的值,其余的只是在第一个\0 char 之前在堆栈上找到的一些随机字符)。

    如果您想获取地址,请尝试使用static_cast&lt;void*&gt;(c)

    我的例子:

    int main() {
      char *c;
      char b = 'd';
      c = &b; 
      cout << c << ", " << static_cast<void*>(c) << endl;
    }
    

    一个输出:

    dÌÿÿ, 0xffffcc07
    

    查看“d”之后的奇怪字符。

    我希望这能有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      相关资源
      最近更新 更多