2014-02-02 6 views
-2

В чем разница между распределением и инициализацией? Сколько раз выделяется нижняя переменная x, если есть int и статический int?Разница между распределением и инициализацией

int main(){ 
int i = 2; 
int j; 
for(j = i; j < 20; j++){ 
    int x = 5; 
    //static int x =5; 
    printf("\n x = %d \n",x); 
} 
return 0; 
} 
+1

Похоже, что школьное задание. – nothrow

+1

@Yossarian Полностью неактуальен, если вопрос верен. – this

+1

Это зависит от того, что вы подразумеваете под «выделенным». –

ответ

2

В названии говорится «Распределение и инициализация», и в этом вопросе говорится «Распределение и объявление».

Либо случаи

На самом деле это зависит от реализации компилятора. Если переменная объявлена, но никогда не используется, интеллектуальный компилятор выдает предупреждение и не выделяет его вообще в стеке.

Распределение означает предоставление пространства в стеке (или кучу, если его malloc ред). Инициализация означает присвоение значения переменной. И Декларация сообщает компилятору, что переменная существует. Это также может означать, что переменная существует в каком-либо другом объектном файле, если ей предшествует extern.

Чтобы ответить на ваш второй вопрос, опять же зависит его компилятор .. если компилятор видит, что значение переменной не изменяется, то int x будет выделен один раз. Распределение в основном переводит стек вызовов на несколько вырезок для размещения данных. И освобождение будет заключаться в том, чтобы переместить стек вызовов на несколько вырезов (или байтов, если вы предпочитаете).

С другой стороны, static int выделяется только один раз, вне области хранения стека, который обычно не позволяет освободить переменную до тех пор, пока программа не завершит ее выполнение.

0

Поскольку переменная x объявлена ​​внутри цикла, ее область видимости находится внутри цикла. Таким образом, переменная уничтожается каждый раз, когда элементы управления завершают выполнение цикла. Затем повторно инициализируется, когда он достигает тела цикла.

Но если объявлено статическим, инициализация выполняется только один раз.

2

В чем разница между распределением и интилизацией?

  • распределение это действие взятия - отведение - часть памяти для переменной;
  • initalization - это действие установки значения внутри выделенной памяти.

Сколько раз нижняя переменная x распределяется, если имеется int?

for(j = 2; j < 20; j++){ 
    int x = 5; 
    … 
} 

в этом примере переменная x получает выделено в 18 раз, и высвобождены на каждой итерации. Хотя компилятор может оптимизировать и повторно использовать эту выделенную область, чтобы сэкономить несколько циклов. И эта переменная также инициализируется 18 раз.

и статический int?

for(j = 2; j < 20; j++){ 
    static int x = 5; 
    … 
} 

Статическая переменная x будет выделяться один раз, и никогда не будет освобождаться, так как компилятор не может сказать, если функция может получить снова вызовем позже в программе (даже если это очевидно для программиста). Статическая переменная также будет инициализирована только один раз. Для того, чтобы показать, как статическая переменная ведет себя проверить следующую программу:

void foo() { 
    for(int i = 0; i < 20; i++){ 
     static int x = 5; 
     printf("%d\n", x); 
     x = 2; 
    } 
} 

int main(){ 
    foo(); 
    return 0; 
} 

, который будет производить один 5 и 17 2.

HTH

Смежные вопросы