C++内存测试返回奇怪的输出

Sla*_*are 4 c++ memory

Slackware在这里.我只是搞乱内存和指针...我想学习更多关于那些,所以我在c ++中创建了一个数组,并查找其中第一项的内存地址......:

string foo[3] = {"a", "b", "c"};
cout << *(&foo[0]-4) << endl;
Run Code Online (Sandbox Code Playgroud)

它输出:http://pastebin.com/K0HAL5nJ 整个代码:

#include <iostream>

using namespace std;

int main()
{
    string foo[3] = {"a", "b", "c"};
    cout << &foo[0] << " minus " << &foo[1] << " equals " << int(&foo[0])-int(&foo[1]) << endl;
    cout << *(&foo[0]-4) << endl;
    cout << "Hello world!" << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我是c ++的完全初学者,并且不明白为什么会发生这种情况...我知道这种代码不应该......但是,仍然可以请任何人解释那里发生的事情吗?

Jos*_*eld 6

这是未定义的行为.&foo[0]为您提供第一个std::string对象的地址,然后从中减去4.来自§5.7添加剂运算符:

如果指针操作数和结果指向相同的数组对象,或一个过去的数组对象的最后一个元素的元素两者,所述评估也不得产生溢出; 否则,行为未定义.

未定义的行为意味着您可以体验任何事物.可能发生的是一些内存区域,在数组开始之前的四个位置,即不是有效std::string对象被视为a std::string.这必将导致丑陋的事情发生.