C - Проверьте, назначено ли целое число - PullRequest
27 голосов
/ 04 августа 2009

Как определить, является ли целое число неназначенным?

int i; /* no assignment */

if (/* conditional statement here to check if int i is unassigned or not */) {
   printf("Integer is unassigned!\n");
} else {
   printf("Integer is assigned!\n");
}

Ответы [ 12 ]

0 голосов
/ 04 августа 2009

Проверка того, является ли используемая переменная инициализированной (назначенной) во время выполнения, общеизвестно трудна для C. Нет языковой поддержки для нее, и информации, доступной во время выполнения, просто недостаточно для идеального обнаружения неинициализированных значений. Инструменты динамического анализа, такие как Valgrind / Memcheck, проходят большую часть (например, отслеживают каждый байт памяти в адресном пространстве вашего процесса, а затем проверяют каждое хранилище, чтобы пометить байт как инициализированный), чтобы определить, инициализировано ли значение, используемое или нет, и все еще подвержены ложным срабатываниям.

Если вы просто пытаетесь свести к минимуму такие ошибки в своих программах, инструменты статического анализа, такие как lint, могут довольно хорошо проинформировать вас о том, используете ли вы неинициализированные переменные или нет. На самом деле, я полагаю, что большинство компиляторов сделают все возможное, чтобы сообщить вам, когда вы делаете это (хотя, конечно, они не идеальны).

0 голосов
/ 04 августа 2009

В C целое число принимает неопределенное значение при его создании. Это означает, что если вы впервые используете это целое число из регистра / ячейки памяти / устройства с 5893872, это значение этого целого числа. (Пробег зависит от компиляции отладки / выпуска.)

Обычный метод решения этой проблемы заключается в использовании бессмысленного значения по умолчанию:

int number_of_widgets = -1;

... или флаг, указывающий его состояние:

int number_of_widgets;
int number_of_widgets_assigned = 0;

if (number_of_widgets_assigned)
  do something
else
  do something else
number_of_widgets_assigned = 1;

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

...