Значения по умолчанию неинициализированных локальных переменных в C - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь разобраться с объявлением и определением переменных в C. В моем учебном материале из школы говорится, что глобальным неинициализированным переменным присваивается 0, тогда как неинициализированные локальные переменные остаются не назначенными и имеют значение, которое присутствовало в этом адресе памяти.

Однако я попробовал следующую очень простую программу:

#include <stdio.h>

void something(){

    int third;
    int fourth;

    printf("third: %d\n", third);
    printf("fourth: %d\n", fourth);
}

int main(){
    int first;
    int second;

    printf("first: %d\n",first);
    printf("second: %d\n",second);
    something();
    return 0;
}

Вывод следующий:

first: 382501330
second: 32766
third: 0
fourth: 0

Второй запуск:

first: 235426258
second: 32766
third: 0
fourth: 0

Замечания:

  • Кажется, переменной 'first' каждый раз назначается случайное число, как и ожидалось

  • Переменной 'секунда' каждый раз присваивается один и тот же номер (32766), почему?

  • Почему переменные «третий» и «четвертый» назначаются нулям, поскольку они являются локальными, а не глобальными переменными?

1 Ответ

0 голосов
/ 30 июня 2018

Вы получаете доступ к неинициализированным местным жителям, которые могли быть объявлены register. Это неопределенное поведение. Ваша программа больше не имеет смысла.

Если исправить это, добавив несколько операторов & (чтобы местные жители больше не могли быть объявлены register)

#include <stdio.h>

void something(){

    int third;
    int fourth;

    printf("third: %d\n", *&third);
    printf("fourth: %d\n", *&fourth);
}

int main(){
    int first;
    int second;

    printf("first: %d\n", *&first);
    printf("second: %d\n", *&second);
    something();
    return 0;
}

тогда, что касается C, значения будут неуказанными. Что вы получите, зависит от вашей окружающей среды и что основная вызывающая libc-подпрограмма оставила в стеке до того, как она сделала вызов main.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...