Переполнение буфера в стеке sprintf - PullRequest
1 голос
/ 25 марта 2019

Я пытаюсь сохранить строку в переменной char, используя sprintf.Код компилируется, но когда я его запускаю, я получаю ошибку переполнения буфера стека.Мой компилятор дает мне информацию о том, почему произошла ошибка, но я не могу сказать, что на самом деле не так.

int numbers [] - это массив длиной 6, а matchHighest - целое число = 0.

Я вызвал match6 в этой функции:

int match(int numbers[], int matchHighest){
    int matchArray[] = {0, 0, 0, 0, 0};
    int i = 0;
    char m6[100] = "";
    char *m6p = m6;
    match6(&numbers[i], matchArray, &m6[100]);   

Вот где происходит ошибка:

int match6 (int numbers[], int matchArray[5], char *m6){
    int i=0;
    while((numbers[i]==numbers[i+1]) && (i<5)){
        i++;
    }
    if(i == 5){
        matchArray[4] = 6 * numbers[0] + 27;
        sprintf(m6, "Rule match-6(%d) - score %d", numbers[0], matchArray[4]);
        printf("%s\n", m6);
    }
    return matchArray[4];
}

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

draft6.c: 98 ошибка времени выполнения - переполнение буфера в стеке

dcc Объяснение: доступ за концом локальной переменной.Убедитесь, что размер вашего массива правильный.Убедитесь, что индексы вашего массива верны.

Здесь остановлено выполнение в match6 (4) - счет 51 ") в draft6.c в строке 98:

if(i == 5){
    matchArray[4] = 6 * numbers[0] + 27;
-->     sprintf(m6, "Rule match-6(%d) - score %d", numbers[0], matchArray[4]);
    printf("%s\n", m6);
}

Значения, когда выполнение остановлено:

i = 5
m6 = "Rule match-6(4) - score 51"
matchArray[4] = 51
numbers[0] = 4

1 Ответ

3 голосов
/ 25 марта 2019

match6(&numbers[i], matchArray, &m6[100]);. Вы передаете адрес предмета после последнего выделенного предмета. После чего match6 пишет вне границ. Вместо того, чтобы делать странные вещи, просто передайте массив:

char m6[100] = "";
match6(&numbers[i], matchArray, m6);  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...