Базовая программа на языке Си перестала работать: как раз вовремя отладчик


В данный момент я изучаю C и скопировал следующее из wibit.com:

#include <stdio.h>

int main()
{
    int* n;
    *n = 20;
    printf("%in", *n);
    return 0;
}

Я использую GCC и компилирую и запускаю в командной строке примерно так:

gcc prgrm.c -o prgrm.exe    #compiles without any errors
prgrm.exe

Затем появляется сообщение об ошибке prgrm.exe перестал работать. Я нажимаю кнопку отладка и получаю следующее:

Отладочный Отчет

Все мои программы запускались раньше, и я протестировал его с помощью еще нескольких (просто верните 0; или printf (и т. д...)) и они работают!

Есть идеи? спасибо

1 2

1 ответ:

int* n;

Объявляет указатель на int. У него нет назначенного адреса, поэтому он указывает на произвольный адрес в памяти. Этот адрес почти наверняка не будет доступен для записи. Даже если он был записан, это не ваша память, поэтому вы не знаете, каковы будут последствия записи.

*n = 20;

Пытается написать на этот непредсказуемый адрес. Это приводит к неопределенному поведению. Сбой-это допустимый (и полезный) тип неопределенного поведения.

Чтобы ваша программа работала, вам нужно выделить хранение для n. Вы можете сделать это на стеке

int n;
n = 20;
printf("%i\n", n);

Или динамически в куче

int* n = malloc(sizeof(*n));
if (n == NULL) {
    printf("Error: out of memory\n");
    return -1;
}
*n = 20;
printf("%i\n", *n);
free(n);
Обратите внимание, что компилятор предупредил бы вас об этом использовании неинициализированной переменной, если бы вы включили предупреждения для своей сборки. Добавьте -Wall в командную строку для gcc или /W4 для MSVC, чтобы включить эту функцию.