指向矢量元素的指针崩溃

Med*_*ine 2 c c++ linux stl segmentation-fault

    vector<int> v;
    v.push_back(1);
    int * p = &v[0];
    for (int i = 2; i <= 100; ++i)
    {
        v.push_back(i);    
    }
    *p = 5;
Run Code Online (Sandbox Code Playgroud)

我知道向量重新分配了新的内存来增加容量,但是p只是一个指向某个内存地址的指针,而p本身并没有改变.即使在向量重新分配之后,p指向的内存也在同一进程的地址空间中.为什么会崩溃?

Ser*_*lis 7

如果您将代码更改为以下内容:

#include <stdio.h>
#include <vector>

int
main(int argc, char* argv[])
{
    std::vector<int> v;
    v.push_back(1);
    int * p = &v[0];

    printf( "Old: %08X\n", &v[0] );
    for (int i = 2; i <= 100; ++i)
    {
        v.push_back(i);    
    }
    printf( "New: %08X\n", &v[0] );

    getchar();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

您将看到内存地址&v[0]几乎总是与重新分配之前的内存地址不同.这意味着您创建的指针现在指向(可能)无效的内存.
你现在只有一个p指向某个内存块的指针.无法保证该内存块中的内容,或者即使它是有效的.

  • p指向的地址仍然在同一个进程地址空间?为什么它会成为无效的地址? (2认同)
  • @Medicine是的,但是在地址空间中不会使内存有效,它只是使它可访问.要有效的内存需要由程序当前分配. (2认同)