Ошибка проверки во время выполнения № 2 — стек вокруг переменной «tempID» был поврежден

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

Пример:

  • введенный идентификатор: 322993
  • НАШЕЛ
  • Нажмите [1] для редактирования ID
  • Введите новый идентификатор
  • программа зависает

Вот код:

void modifyCustomer(){
    int counter=0;
    long int tempID=0;
    flag found = false;
    fflush(stdin);
    printf("Enter Customer ID\n");
    scanf("%lld", &tempID);
    do{
        char option_str[200];
        int option = 0;
        char *not_valid;
        if(tempID == customers[counter].customerID){
            printf("Customer found!\n");
            found = true;
            do{
                fflush(stdin);
                printf("Choose what to modify:\n 1. ID\n 2. Name\n 3. Surname\n 4. Address\n 5. Mobile\nOption: ");
                scanf("%s", &option_str);
                option = strtol(option_str, &not_valid, 10);
                fflush(stdin);
                if (*not_valid != '\0') {
                    printf("%s is not valid.\n", not_valid);
                } else{
                    switch(option){
                    case 1:
                        printf("Enter new ID:\n");
                        scanf("%d\n", &customers[counter].customerID);
                        printf("Customer Modified Successfully!\n");
                        break;
                    case 2:
                        printf("Enter new Name:\n");
                        scanf("%s\n", &customers[counter].customerName);
                        printf("Customer Modified Successfully!\n");
                        break;
                    case 3:
                        printf("Enter new Surname:\n");
                        scanf("%s\n", &customers[counter].customerSurname);
                        printf("Customer Modified Successfully!\n");
                        break;
                    case 4:
                        printf("Enter new Address:\n");
                        scanf("%s\n", &customers[counter].customerAddress);
                        printf("Customer Modified Successfully!\n");
                        break;
                    case 5:
                        printf("Enter new Mobile:\n");
                        scanf("%lld\n", &customers[counter].customerMobile);
                        printf("Customer Modified Successfully!\n");
                        break;
                    default:
                        printf("You did not enter a valid Number. Please re-enter your Input \n");
                        break;
                    }
                }
            }while((option <1) || (option > 5));
        }
        else{
            counter++;
        }
    }while((found != true) && (counter < (custNum-1)));
    if (found == false)
        printf("Customer not found!\n");
}

Почему это происходит?


person user1892265    schedule 10.12.2012    source источник
comment
Не имеет значения для MSVC. Код пытается запихнуть 64-фунтовую свинью в 32-фунтовый мешок. Спецификатор формата должен быть %ld.   -  person Hans Passant    schedule 10.12.2012
comment
что относительно второго аргумента strtol(). т. е. not_valid, ссылка на него разыменовывается без выделения памяти для него.   -  person Jeyaram    schedule 10.12.2012
comment
@HansPassant Согласен на MSVC. Anway: Из чего вы делаете вывод, что это MSVC? Потому что есть ошибки во время выполнения?   -  person alk    schedule 10.12.2012
comment
@rjayavrp Он просто укажет на элемент 1-го параметра, если вообще когда-либо (см. man strtol()).   -  person alk    schedule 10.12.2012
comment
спасибо @alk. The second argument (char **endptr) seems to be a waste of space! указано на странице руководства. так запутался.   -  person Jeyaram    schedule 10.12.2012
comment
@alk — эта диагностика во время выполнения является функцией MSVC.   -  person Hans Passant    schedule 10.12.2012


Ответы (1)


Спецификатор формата %lld предназначен для long long. Вы объявили long int, поэтому, возможно, пытаетесь записать в больший тип, чем у вас есть для хранения. Последствия этого не определены, но запись поверх следующей переменной стека весьма вероятна, если sizeof(long int) != sizeof(long long) на вашей платформе.

Вы можете исправить это, либо изменив tempID на тип long int, либо изменив используемый спецификатор формата на %ld.

person simonc    schedule 10.12.2012
comment
@user1892265 user1892265 Я обновил свой ответ несколькими вариантами исправления этой ошибки. Обратите внимание, что вы можете найти дополнительные ошибки. ответ Алка указывает на один из них - person simonc; 10.12.2012
comment
я исправил эти ошибки, но все равно всякий раз, когда я пытаюсь ввести новые данные (будь то его идентификатор, имя и т. д.), он все еще застревает - person user1892265; 10.12.2012
comment
Можете ли вы добавить ведение журнала, чтобы определить, на какой строке вы застряли? Или объясните, что вы подразумеваете под «зависанием», если выполнение программы не зависает? например программа неожиданно завершает работу? - person simonc; 10.12.2012
comment
Он не выходит неожиданно, он просто висит там, не продолжая выполнение программы! - person user1892265; 10.12.2012
comment
Он не завершается неожиданно ... он просто остается там, как будто чего-то ждет, а затем в MSVC появляется это уведомление: исключение первого шанса по адресу 0x60A4B49C (msvcr110d.dll) в C - Assignment.exe: 0xC0000005: место записи нарушения прав доступа 0x00000000 . Если есть обработчик этого исключения, программа может быть безопасно продолжена. - person user1892265; 10.12.2012