malloc не может выделить память - PullRequest
0 голосов
/ 23 декабря 2018

Я пишу C-код для решения уравнений Эйлера.Мой код прекрасно работает на кластере, но не на моем компьютере.Кажется, проблема с malloc ().Не удается выделить запрошенную память и происходит сбой.

Как мне заставить его работать?это как-то связано с дефрагментацией?Но системные настройки показывают (дефрагментация 0%).

Просто включив сюда часть кода malloc ().

double **u, **rho_u, **rho,    
int Size = 1000;
u = (double**)malloc(Size*sizeof(double*));
for(i=0;i<=Size;i++)
    u[i] = (double*)malloc(Size*sizeof(double));

rho_u = (double**)malloc(Size*sizeof(double*));
for(i=0;i<=Size;i++)
    rho_u[i] = (double*)malloc(Size*sizeof(double));

Ответы [ 3 ]

0 голосов
/ 23 декабря 2018

Вы, вероятно, повредили свою кучу здесь:

for(i=0;i<=Size;i++)
    u[i] = (double*)malloc(Size*sizeof(double));

Вы присваиваете 1001 указатель, но выделено только 1000.Правильная версия:

for(i=0;i<Size;i++)
    u[i] = (double*)malloc(Size*sizeof(double));

То же самое для второго цикла.

0 голосов
/ 23 декабря 2018

Наблюдение:

  • Избегать приведения типов malloc(), Чтение Использовать ли я результат malloc?
  • Проверить возвращаемое значение malloc() &выполните правильную обработку ошибок.
  • Измените условие цикла с i<=Size на i<Size, так как оно вызывает переполнение буфера, так как более ранняя память была выделена только для Size строк, а не size+1 строк.

Попробуйте эту версию:

int Size = 1000;
double **u = malloc(Size * sizeof(*u)); /* typecasting is not needed */
if(u == NULL) {
   /* @TODO error handling */
}
for(i=0;i<Size;i++) { /* loop should rotate only 1000 times not 1001 times */
    u[i] = malloc(Size * sizeof(**u));
    if(u[i] == NULL) {
         /* @TODO error handling */
    }
}

Аналогично для rho_u и rho.

0 голосов
/ 23 декабря 2018

Внимательно внимательно документация malloc.Он может потерпеть неудачу, а когда он потерпит неудачу, malloc вернет NULL (а причина отказа задается как errno, который вы часто отображаете с помощью perror).

Таким образом, вы должны проверить на отказ malloc.Типичный код по крайней мере:

u = (double**)malloc(Size*sizeof(double*));
if (u==NULL) { perror ("malloc u"); exit(EXIT_FAILURE); };

и аналогично для вашего rho_u и каждого rho_u[i]

Некоторые операционные системы могут обеспечивать превышение памяти .Эта функция мне не нравится.

Подумайте об инициализации каждой зоны памяти полностью.И использование памяти вне допустимой зоны памяти (или действительного адреса) - это неопределенное поведение (и у вашей программы есть такая, замеченная Ctx-ответом ).Будь напуган .

Я также рекомендую использовать valgrind .Это очень удобный инструмент для поиска ошибок, связанных с памятью, и он мог обнаружить ваши.

...