【问题标题】:How Should I print a pointer of a Char [duplicate]我应该如何打印 Char 的指针 [重复]
【发布时间】:2021-04-02 22:28:27
【问题描述】:

使用此代码时:

int main()
{
    char grade = 'A';
    char *pGrade = &grade;

    std::cout << pGrade;

    return 0;
}

它给了我一个奇怪的结果,比如:

 A╠╠╠╠╠╠╠╠ÿ√∩

我应该怎么做才能让它给我正确的输出?

【问题讨论】:

  • 你期待什么结果?
  • 很抱歉以不相关的语言结束。原理是一样的。

标签: c++ pointers


【解决方案1】:

输出指针地址的另一个选项是使用reinterpret_cast conversionstd::uintptr_t,例如

#include <iostream>

int main () {
    
    char grade = 'A';
    char *pGrade = &grade;
    
    std::cout << std::hex << reinterpret_cast<std::uintptr_t>(pGrade) << '\n';
}

使用/输出示例

$ ./bin/castptr2uniptr
7fff6e3e8d1e

如果我误解了您的问题,而您实际上想使用指针输出字符 'A',则只需取消引用指针,例如

std::cout << *pGrade << '\n';

这会导致'A' 被输出。

【讨论】:

  • 不用投*pGrade,已经是char了。
  • 啊,好点子。谢谢。
【解决方案2】:

您应该将其打印为void *,这只是一个通用指针。 std::cout 假定 char * 是以空字符结尾的字符串,因此如果您打印指向字符而不是字符串的指针,它将继续打印,直到达到空字节。通过使用void *,您可以确保不会出现混淆。

char c = 'A';
std::cout << (void *)&c;

输出:

0x7ffcf2013567

【讨论】:

    【解决方案3】:

    您正在调用 operator&lt;&lt; 重载,该重载将 null-terminated char* 字符串作为输入。但是您的数据不是以空值结尾的,这会导致undefined behavior。您在输出中看到了额外的垃圾,因为operator&lt;&lt; 正在打印grade 变量之后的周围内存,直到它遇到0x00 字节。但它可能很容易使您的代码崩溃,或损坏内存,或完成其他任何事情。这就是未定义行为的本质。

    如果要打印指针指向的内存地址,请使用operator&lt;&lt; 重载,它采用void*

    int main()
    {
        char grade = 'A';
        char *pGrade = &grade;
        std::cout << static_cast<void*>(pGrade);
        return 0;
    }
    

    如果您只希望自己打印 A,则使用采用单个 charoperator&lt;&lt; 重载:

    int main()
    {
        char grade = 'A';
        char *pGrade = &grade;
        std::cout << *pGrade;
        return 0;
    }
    

    或者,使用cout.write()

    int main()
    {
        char grade = 'A';
        char *pGrade = &grade;
        std::cout.write(pGrade, 1);
        return 0;
    }
    

    否则,空终止您的数据:

    int main()
    {
        char grade[2] = {'A', '\0'};
        char *pGrade = grade;
        std::cout << pGrade;
        return 0;
    }
    

    【讨论】:

      【解决方案4】:

      你有一个正确的指针。但是,在 C 中,始终假定 char * 是一个以零结尾的字符串。因此,cout 格式化程序将所有内容打印到下一个零字节。注意到开头的“A”了吗?

      如果您出于某种原因想要查看指针的数值,则必须将其转换为 (uint64_t),并且您可能希望以十六进制打印:

          std::cout << std::hex << (uint64_t)pGrade << "\n";
      

      【讨论】:

        猜你喜欢
        • 2013-10-17
        • 1970-01-01
        • 1970-01-01
        • 2012-10-29
        • 2017-11-15
        • 1970-01-01
        • 1970-01-01
        • 2020-06-03
        • 2020-03-16
        相关资源
        最近更新 更多