Вопрос

Когда программа C запускается и переменные присваиваются ячейкам памяти, говорит ли стандарт C, инициализировано ли это значение?

// global variables
int a;
int b = 0;
static int c;

В приведенном выше коде 'b' будет инициализировано равным 0. Каково начальное значение 'a'? Отличается ли 'c', поскольку он статичен для этого модуля?

Это было полезно?

Решение

Поскольку вы специально упоминаете глобальные переменные: в случае глобальных переменных, независимо от того, объявлены они статические или нет, они будут инициализированы равными 0.

С другой стороны,

локальные переменные будут неопределенными (если только они не объявлены static , и в этом случае они тоже будут инициализированы равными 0 - спасибо, Тайлер МакГенри). В переводе это означает, что вы не можете полагаться на то, что они содержат какую-то конкретную вещь - они просто будут содержать любой случайный мусор, который уже был в памяти в этом месте, который может отличаться от запуска к запуску.

Другие советы

  

Изменить: Следующее относится только к локальным переменным, но не к глобальным.

Начальное значение переменной не определено. В некоторых языках расположение переменной в памяти обнуляется при объявлении, но в C (и C ++) неинициализированная переменная будет содержать любой мусор, который живет в этом месте в то время.

Поэтому лучше всего думать о том, что неинициализированная переменная, скорее всего, будет содержать мусор и иметь неопределенное поведение.

a будет равно нулю, а также c , если они глобальные и явно не инициализированы. Это также верно для локальных статических переменных.

Только локальные нестатические переменные не инициализируются. Также память, выделенная с помощью malloc, не инициализируется.

См. здесь для правил инициализации и размещения в C для разных объектов.

Быстрый тест показывает, что a и c равны 0.

int a;
static int c;
int main() {
    printf("%d %d\n", a, c);
    return 0;
}

Местоположение a (и c) определяется во время компиляции; то есть они не помещаются ни в стек, ни в интервал памяти, возвращаемый функцией malloc. Я думаю, что стандарт C говорит, что они инициализируются на 0 во всех случаях.

Я на 99,9% уверен в отношении c и на 98% уверен в отношении a . Ключевое слово static в контексте глобальных переменных действительно аналогично private в (скажем) C ++ и Java: оно касается видимости, а не места хранения.

То, что Эндрю Хэйр говорит о неинициализированных переменных, верно для данных, хранящихся в стеке или в памяти malloc'd. Это не так для статически хранимых переменных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top