c++ - 带有字符的奇怪指针行为

标签 c++ pointers c++11 char

当我观察到一个奇怪的行为时,我正在研究结构和它们的指针。在下面的代码中,我创建了一个包含:id、last_name_inital、full_name 和 first_name_inital 的结构。查看 int 和 string 的内存地址工作正常,但查看 chars 会给出损坏的输出。我在显示相同行为的结构外添加了字符。只看一个 char 输出,它的指针输出返回相同的 char,所以没有地址。

#include <iostream>
#include <string>
using namespace std;

struct entry
{
    int id = 1;
    char last_name_inital = 'S';
    string full_name = "August Smith";
    char first_name_inital = 'A';
};

int main()
{
    entry aug;
    entry *p_aug = &aug;
    
    char alpha ='A';
    char *p_alpha = &alpha;

    char sirra ='S';
    char *p_sirra = &sirra;
    
    cout << "Printing structure address" << endl;
    cout << p_aug << endl;
    cout << "\n";
    
    cout << "Printing id and it's address" << endl;
    cout << p_aug->id << " " << aug.id << endl;
    cout << &p_aug->id << " " << &aug.id << endl;
    cout << "\n";
    
    cout << "Printing last_name_inital and it's address" << endl;
    cout << p_aug->last_name_inital <<" "<< aug.last_name_inital << endl;
    cout <<&p_aug->last_name_inital<<" "<< &aug.last_name_inital << endl;
    cout << "\n";

    cout << "Printing full_name and it's address" << endl;
    cout << p_aug->full_name << " " << aug.full_name << endl;
    cout << &p_aug->full_name << " " << &aug.full_name << endl;
    cout << "\n";

    cout << "Printing first_name_inital and it's address" << endl;
    cout << p_aug->first_name_inital <<" "<<aug.first_name_inital<< endl;
    cout <<&p_aug->first_name_inital<<" "<<&aug.first_name_inital<< endl;
    cout << "\n";
    
    cout << "Printing alpha and it's address" << endl;
    cout << *p_alpha << " " << alpha << endl;
    cout << p_alpha << " " << &alpha << endl;
    cout << "\n";

    cout << "Printing sirra and it's address" << endl;
    cout << *p_sirra << " " << sirra << endl;
    cout << p_sirra << " " << &sirra << endl;
    cout << "\n";


}

给出以下输出(使用 geany、g++、linux 编译和编写):

Printing structure address

0x7fff01772360

Printing id and it's address

1 1

0x7fff01772360 0x7fff01772360

Printing full_name and it's address

S S

S S

Printing last_name_inital and it's address

August Smith August Smith

0x7fff01772368 0x7fff01772368

Printing last_name_inital and it's address

A A

A@ A@

Printing alpha and it's address

A A

AS#w� AS#w�

Printing alpha and it's address

S S

S#w� S#w�

每次运行最后的输出都会改变,所以很明显有些东西正在改变。 在线搜索只给出了这个问题,它涉及相同的背景但不是真的或者我不明白。 character pointers in C++

基本上我的主要问题是那里发生了什么,是否可以输出一个字符指针,那么它存储在哪里?

谢谢


编辑:

快速响应解决了如何打印出一个字符的指针地址的问题。通过使用:(void*)(&char_name)

然而,这让我想知道为什么正常字符的 cout 值发生变化,但结构内部字符的值在重新运行时保持不变。特别是因为 cout 结构中 char 'S' 的行为是提到的 operator-overloaded-just-give-back-the-char-itself 但不是用于 'A',也不适用于结构外的普通字符。

谁能解释这些差异?甚至这不会发生在你身上?

最佳答案

你可以转换 char *void * .问题是,operator<<重载阅读 char *作为 c_string。

cout << "Printing last_name_inital and it's address" << endl;
cout << p_aug->last_name_inital <<" "<< aug.last_name_inital << endl;
cout << (void*)(&p_aug->last_name_inital) <<" "<< (void*)(&aug.last_name_inital) << endl;
cout << "\n";

关于c++ - 带有字符的奇怪指针行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29165606/

相关文章:

c++ - 计数 Solaris 上的函数调用

c++ - 尝试将 GTK+ 窗口渲染为图像

Swift2,在 CFSocketCallBack 中调用 swift 函数 - EXEC_BAD_ACCESS

c - 将数组称为指针

c++ - C++11 中是否有一个模板来推断将值传递给函数时要使用的最佳类型?

c++ - 打印未初始化的引用给出 1. 为什么?

c++ - 使用std::unique_ptr boost 图形捆绑属性

c++ - 使用指针时的注意事项?

c++ - 在 C++11 中打印编译时整数序列

c++ - 如何编译 ZBar 示例? (未定义引用...)