奇怪的指针行为与字符

时间:2015-03-20 11:35:38

标签: c++ pointers c++11 char

当我观察到一种奇怪的行为时,我正在玩结构和指针。在下面的代码中,我创建了一个包含:id,last_name_inital,full_name和first_name_inital的结构。查看int和string的内存地址工作正常,但查看字符会给出损坏的输出。我在结构外添加了表示相同行为的字符。只看一个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编译和编写):

  

打印结构地址

     

0x7fff01772360

     

打印ID及其地址

     

1 1

     

0x7fff01772360 0x7fff01772360

     

打印full_name及其地址

     

S S

     

S S

     

打印last_name_inital及其地址

     八月史密斯八月史密斯

     

0x7fff01772368 0x7fff01772368

     

打印last_name_inital及其地址

     

A A

     

A @ A @

     

打印alpha及其地址

     

A A

     

AS #w� AS#瓦特

     

打印alpha及其地址

     

S S

     

取值#w� S#瓦特

在每次运行时,最后一次输出都会发生变化,所以显然有些事情在变化 在线搜索只给出了这个问题,这种问题触及了相同的背景但不是真的,或者我没有得到它。 character pointers in C++

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

谢谢


修改

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

然而,它让我想知道为什么正常字符的cout值会发生变化,但结构内部的字符值在重新运行时保持不变。特别是因为带有char 'S'的结构中cout的行为是提到的运算符重载 - 只是给后面的char本身而不是'A'而不是{{1}}对于结构外的正常字符。

任何人都可以解释这些差异吗?或者甚至不会发生这种情况吗?

3 个答案:

答案 0 :(得分:3)

您可以将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";

答案 1 :(得分:0)

ostream& operator<< (ostream& os, const char* s);是写char非地址的序列,强制转换为void*以获取地址。

答案 2 :(得分:0)

通常情况下,地址因程序执行而异,因为操作系统碰巧有不同的内存位置,或出于安全原因故意在数据周围进行混洗。

检查指针值仅对比较同一程序实例中的指针非常有用:例如,p_aug&aug具有相同的值。