Переполнение буфера кучи при попытке перераспределения памяти. C Язык - PullRequest
3 голосов
/ 26 февраля 2020

Я писал коды для Min Stack на LeetCode. Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь перераспределить память (по методу pu sh), он говорит мне: «Address Sanitizer: переполнение буфера кучи».

Что является причиной этого и как я могу решить проблему? Спасибо

Кроме того, что может быть лучше для решения этой проблемы?

typedef struct {

    int top;
    int *arr;
    int min;
    int size;
} MinStack;

/** initialize your data structure here. */

MinStack* minStackCreate() {
    MinStack* stack = (MinStack*)malloc(sizeof(MinStack));
    stack->size = 10;
    stack->top = -1;
    stack->min = INT_MAX;
    stack->arr = (int*) malloc(sizeof(int)*(stack->size));
    return stack;
}

void minStackPush(MinStack* obj, int x) {
    //if top+1 is equal to the size of the stack(when stack is full), 
    //I want to multiply the size by 2
    //so more numbers can fit in the stack. 

    if(obj->top+1 == obj->size){
        obj->size = obj->size*2; // this line seems to give me issues. 
        obj->arr = realloc(obj->arr, obj->size);
    }

        obj->arr[obj->top+1] = x;
        obj->top++;
}

Ответы [ 2 ]

5 голосов
/ 26 февраля 2020

Похоже, проблема связана с вашим realloc вызовом, согласно странице справочника: The realloc() function changes the size of the memory block pointed to by ptr to size bytes.

Так что вам нужно иметь obj->arr = realloc(obj->arr, sizeof(int) * obj->size); В противном случае ваша индексация будет отключена.

Также кажется, что вы вызываете realloc при каждом вызове, а не только тогда, когда вам нужно увеличить размер вашего массива, я бы посоветовал переместить этот вызов внутрь вашего оператора if(obj->top+1 == obj->size).

3 голосов
/ 26 февраля 2020

Недостаточное / неправильное распределение. realloc() нужен счетчик байтов, а не только количество элементов.

// obj->arr = realloc(obj->arr, obj->size);
obj->arr = realloc(obj->arr, sizeof *(obj->arr) * obj->size);

В стороне: Надежный код проверяет результат realloc() перед присвоением obj->arr. @ Евгений Sh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...