gets () вызывает повреждение памяти?

0

Окружающая среда: VS2013 Express, Windows 7.

Исходные коды очень просты:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int TestNum, k, idx;
    char *strbuf1 = NULL;
    strbuf1 = (char *)malloc(sizeof(char) * 10001);
    if (strbuf1 == NULL){
        printf("memory allocation failed\n");
        return -1;
    }

    gets(strbuf1);
    TestNum = atoi(strbuf1);
    for (k = 0; k < TestNum; k++){
        gets(strbuf1);
        printf("k= %d, strbuf1=%s\n", k, strbuf1);
        //--- read data ---//
        idx = 0;
        while (idx < 5){
            gets(strbuf1);
            idx ++;
        }
    }
    return 0;
}

После создания кода в исполняемый файл, скажем, foo.exe, я протестировал его с помощью "foo.exe <testinput.txt" в окне cmd. Это сломается полностью, но я не могу понять, почему. Кто-нибудь знает?

Я загрузил файл testinput.txt на GDrive, https://docs.google.com/document/d/1d8jBPZfYYjtA9R1CldUZhyRvaAiK5Xk9K-mhE6dIDKU/edit?usp=sharing

  • 0
    Какой размер testinput.txt ?
  • 3
    Вы действительно не должны использовать gets , так как это очень легко получить переполнение буфера.
Показать ещё 6 комментариев
Теги:

1 ответ

2
Лучший ответ

Заменить эту строку:

gets(strbuf1);

с:

fgets(strbuf1, 10000, stdin);

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

  • 1
    Вы имеете в виду 10001 (размер strbuf1 )?
  • 0
    Я использовал на один символ меньше, чтобы учесть последние 0, которые должны заканчивать строку. Имеет смысл установить последний символ на 0 на всякий случай.
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню