C 访问大型堆阵列时出现分段错误(内核转储)

C 访问大型堆阵列时出现分段错误(内核转储),c,linux,segmentation-fault,C,Linux,Segmentation Fault,我们知道分段错误(内核转储)是由非法内存访问引起的。但我不认为这是我的程序的原因。 在linux上运行以下c代码,当变量l=20时,它工作,但当l=50时,我得到了分段错误(内核转储)。我的笔记本电脑是ubuntu18.04,8核,16G内存 // // Created by sakura on 2020/4/11. // #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include &

我们知道分段错误(内核转储)是由非法内存访问引起的。但我不认为这是我的程序的原因。
在linux上运行以下c代码,当变量l=20时,它工作,但当l=50时,我得到了分段错误(内核转储)。我的笔记本电脑是ubuntu18.04,8核,16G内存

//
// Created by sakura on 2020/4/11.
//
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

void *emalloc(size_t n);
int main(){
    printf("begin alloc...\n");
    char* rv;
    int l=50;
    for(int i=0;i<l;i++){
        rv=emalloc(1024*1024*100);
        sleep(1);
    }
    printf("finish alloc...\n");

    for(int i=0;i<l;i++){
        for(int j=0;j<1024*1024*100;j++){
             int a = rand();
            rv[i*1024*1024*100+j]=(a%128);
        }
    }
    printf("finish access...\n");
    sleep(300);
    return 0;
}

void fatal(char *s1,char *s2,int n){
    fprintf(stderr,"Error: %s, %s\n",s1,s2);
    exit(n);
}

void *emalloc(size_t n){
    void *rv;
    if((rv=malloc(n))==NULL){
        fatal("out of memory","",1);
    }
    return rv;
}

//
//由樱花于2020/4/11创建。
//
#包括
#包括
#包括
#包括
空隙*emalloc(尺寸);
int main(){
printf(“开始分配…\n”);
char*rv;
int l=50;

对于(int i=0;i在此行中使用
i=50
时出现整数溢出:

rv[i*1024*1024*100+j]=(a%128);
这会导致未定义的行为(请参阅)

50*1024*1024*100
的值等于
5242880000
,但
int
类型变量(请参见中的
int\u MAX
常量)的最大值为
2147483647


我建议你考虑使用一个不同的数据类型,用于<代码> i >代码>变量,例如,代码> SsieZyt .

(<代码> >(int i=0;IGOD问题)。点RV应该只适用于100MB内存区域。BUF实际上可以访问100MB×20内存区域。不知道为什么。我怀疑“BUF实际上可以访问100MB×20内存区域”。是一个不正确的结论。当l=20时,使用
ps-u
我可以看到RSS是2G的。是的,使用2G的代码是2G的,但由于错误,它的损耗为100MB*19。