Ошибка сегментации (ядро сброшено) при доступе к большому массиву кучи - PullRequest
0 голосов
/ 11 апреля 2020

мы знаем, что ошибка сегментации (дамп ядра) вызвана неправильным доступом к памяти. Но я не думаю, что это причина моей программы.
запускаю следующий код c на linux, когда переменная l = 20, это работает, но когда l = 50, я получил ошибку сегментации (ядро сброшено). мой ноутбук ubuntu18.04, 8core, 16G MEMORY.

//
// 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;
}

1 Ответ

1 голос
/ 11 апреля 2020

Вы получили целочисленное переполнение при использовании i = 50 в этой строке:

rv[i*1024*1024*100+j]=(a%128);

Это приводит к неопределенному поведению (см. этот вопрос ).

Значение 50*1024*1024*100 равно 5242880000, но максимальное значение для переменной типа int (см. INT_MAX константу в limit.h ) равно 2147483647.

Я предлагаю вам рассмотреть возможность использования другого типа данных для переменной i, например, size_t.

...