访问特定阵列位置/索引时出现分段错误

问题描述 投票:-1回答:2

[我使用malloc函数将10 ^ 9个存储位置分配为数组的一部分。

代码1成功执行。

代码1:

int main(){

    int size = (int)(1e9);

    int* arr = (int*) malloc( size * sizeof(int) );

    for(int i=0;i<size;i++){

        arr[i] = i;
    }    

    return 0;
}

但是当我尝试访问特定的内存位置或索引值= 12345678(即<1e9)时,出现了分段错误

代码2:

int main(){

    int size = (int)(1e9);

    int* arr = (int*) malloc( size * sizeof(int) );

    for(int i=0;i<size;i++){

        arr[i] = i;
    }    

    cout<<arr[12345678]<<endl; //added this line of code, which gives segmentation fault

    return 0;
}

我的猜测是,这是由于内存碎片而引起的,但是对此我不确定。谁能解释正确的原因。

c++ memory-management
2个回答
1
投票

绝对是

  1. 编译器优化

  2. 限制每个标准沙箱的内存分配


0
投票

现代操作系统正在执行一种称为“惰性分配”的操作,这意味着当您要求分配内存时,它们会在没有实际分配内存的情况下将其分配给您。

这正是使用top时看到的虚拟内存与物理内存占用的原因。

仅当您尝试使用缓冲区本身时才真正分配内存。

在您的示例中,您分配了很多内存(4GB),操作系统允许您分配它,但实际上并没有释放它所需的内存,一旦尝试使用它,它将尝试实际提供您要求的内存无法执行,因此崩溃了。

© www.soinside.com 2019 - 2024. All rights reserved.