指向向量元素的指针崩溃

pointer to a vector element crashes

本文关键字:指针 崩溃 元素 向量      更新时间:2023-10-16
    vector<int> v;
    v.push_back(1);
    int * p = &v[0];
    for (int i = 2; i <= 100; ++i)
    {
        v.push_back(i);    
    }
    *p = 5;

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

如果您将代码更改为:

#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: %08Xn", &v[0] );
    for (int i = 2; i <= 100; ++i)
    {
        v.push_back(i);    
    }
    printf( "New: %08Xn", &v[0] );
    getchar();
    return 0;
}

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