Базовая программа на языке Си перестала работать: как раз вовремя отладчик
В данный момент я изучаю 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 ответ:
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, чтобы включить эту функцию.