Как выделить память в этой функции без ошибок сегментации - PullRequest
0 голосов
/ 30 октября 2019

Когда я пытаюсь запустить мою программу с этой функцией, я получаю ошибку сегментации, потому что буфер стека переполняется. Может кто-нибудь помочь?

void converttobin(int a,  int b, char x) {
    char binary[81];
    int number = 0;
    char bit;
    char original[81];
    int dividing = 0;
    number = a;
    size_t len = strlen(binary);
    while (a != 0) {
        dividing = a % 2;
        bit = dividing + '0';
        binary[len++] = bit;
        binary[len] = '\0';
        a = a / 2;
    }
    if (number == 0) {
        a = 0;
        bit = 0 + '0';
        binary[len++] = bit;
        binary[len] = '\0';
    }
    strncpy(original, binary, strlen(original));
    reverse(binary, number, b);
    comparing(binary, original,number, b, x);
    memset(binary, 0, strlen(binary));
    memset(original, 0, strlen(original));
}

1 Ответ

0 голосов
/ 30 октября 2019

Как отмечает @Christian Gibbons в своем комментарии, binary не инициализируется, когда вы вызываете strlen. Но что это значит?

strlen обходит массив, начиная с первого элемента, считая не заканчивающиеся символы. Он не останавливается, пока не найдет завершение ('\0'). Если вам не повезло, это может быть длинным путем в неинициализированных данных, и, вероятно, будет далеко за 81 выделенный вами символ. Через некоторое время strlen начинает смотреть на память, которой не разрешено, и вы получаете ошибку сегментации (ваша программа исследована за пределами выделенного сегмента памяти).

Вы можете решить эту проблему несколькими способами. Самое простое:

char binary[81] = { 0 };

Это просит компилятор установить первый элемент на ноль (завершающий символ). Это хорошо, потому что это первый символ, который strlen увидит и сразу остановит, сообщив, что ваша строка имеет длину 0.

Но, взглянув на ваш алгоритм, вы можете просто отказаться от вызова strlen и выполнить:

size_t len = 0;

Но даже если вы воспользуетесь этим подходом, хорошей практикой будет инициализация ваших буферов безопасными значениями в любом случае.

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