Я не могу решить эту ошибку: переполнение буфера кучи на Leetcode - PullRequest
0 голосов
/ 04 марта 2020

Мой код ниже:

int* smallerNumbersThanCurrent(int* nums, int numsSize, int* returnSize){
    int count;
    int* out = malloc(500);
    int i, j;

    for(i = 0; i < numsSize; ++i){
        count = 0;
        for(j = 0; j < numsSize; ++j){
            if(nums[i] > nums[j]){
                count++;
            }
        }
        *(out + i) = count;
    } 

    return out;
}

и сообщения об ошибках ниже

enter image description here

На самом деле это переполнение кучи-буфера продолжало появляться, когда Я решил проблемы с Leetcode. даже если он хорошо работает в Терминале на Ма c.

будет благодарен за любые комментарии или помощь в этом!

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Во-первых, вы не проверяете функцию mallo c.

Во-вторых, аргумент returnSize не используется в этой функции.

Ваша функция не будет выполнена, если numsSize > (500/ sizeof(int))

Может быть, код ниже может помочь вам

int* smallerNumbersThanCurrent(int* nums, int numsSize){
   int count;
   int* out = malloc(numsSize * sizeof(int));
   if (out) {
       fprintf(stderr, "%s: malloc failed\n", __func__);
       exit(EXIT_FAILURE);
   }

   for(int i = 0; i < numsSize; ++i){
       count = 0;
       for(int j = 0; j < numsSize; ++j){
            if(nums[i] > nums[j]){
               count++;
            }
       }
      *(out + i) = count;
  } 

   return out;
}
0 голосов
/ 04 марта 2020

Поскольку я думаю, что это домашняя работа, я описываю то, что приходит мне в голову, только взглянув на код:

Сначала вы выделяете 500-байтовый буфер в куче (malloc(500)) в точке где вы еще не знаете точный размер. Также вы не проверяете, возвратил ли mallo c указатель NULL. Я бы изменил эту строку на calloc(numsSize, sizeof(*out)), так как результирующий массив в худшем случае имеет тот же размер, что и входной массив. Также добавьте проверку на возвращаемое значение.

Во-вторых, вы передаете переменную для хранения счетчика результатов, но нигде не назначаете ее. Без этой информации вызывающая сторона не может знать, сколько элементов в результирующем массиве являются действительными.

...