对于个别结构数据成员古怪的指针地址(Weird Pointer Address for Indivi

2019-07-30 16:17发布

我今天看到一些奇怪的行为,代码如下:

代码 :

#include <iostream>

struct text
{
    char c;
};

int main(void)
{
    text experim = {'b'};
    char * Cptr = &(experim.c);

    std::cout << "The Value \t: " << *Cptr << std::endl ;
    std::cout << "The Address \t: " << Cptr << std::endl  ; //Print weird stuff

    std::cout << "\n\n";

    *Cptr = 'z';   //Attempt to change the value

    std::cout << "The New Value \t: " << *Cptr <<std::endl ;
    std::cout << "The Address \t: " << Cptr << std::endl ; //Weird address again

    return 0;
}

问题:

1)我唯一的问题是,为什么cout theAddress上面的代码会出来一些奇怪的值?

2)为什么我仍然可以改变成员的值c由dereferenncing其中有古怪地址指针?

Answer 1:

考虑固定这样的代码:

std::cout << "The Address \t: " << (void *)Cptr << std::endl ;

有一个std::ostream& operator<< (std::ostream& out, const char* s ); 这需要一个char*所以你必须强制转换为void*打印地址,而不是一个字符串为“点”,以



Answer 2:

我觉得“不可思议”的东西显示出来,因为cout认为它是一个CString,即0终结的字符数组,所以如你预期它不会打印地址。 而且,由于你的“串”不为0,终止,所有它能做的就是走在内存中,直到它遇到一个0 。 概括起来, 你不实际打印的地址

为什么我仍然可以通过dereferenncing其中有古怪地址指针更改成员c的值

地址是不奇怪的,如上所述。 在你的代码Cptr指向有效的存储位置,你可以做你想做的事情几乎任何东西。



文章来源: Weird Pointer Address for Individual Struct Data Member