单个结构数据成员的奇怪指针地址

时间:2012-07-28 08:23:38

标签: c++ pointers struct pointer-address

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

守则:

#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的值?

谢谢。

2 个答案:

答案 0 :(得分:5)

我认为“奇怪”的东西出现了,因为cout认为它是一个cstring,即一个0终止的字符数组,因此它不会按预期打印地址。而且由于你的“字符串”不是0终止的,它所能做的就是走内存直到它遇到0。总结一下,你实际上并没有打印地址

  

为什么我仍然可以通过取消分配来改变成员c的值   指针有奇怪的地址

如上所述,地址并不奇怪。在您的代码中Cptr指向一个有效的内存位置,您可以使用它做任何你想做的事情。

答案 1 :(得分:5)

考虑修改这样的代码:

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

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