Инициализация массива C++

Почему, если мы не инициализируем переменную, то при попытке работы с ней будет ошибка

int main(){
    char  x;
    cout << x;
    system("pause");
}
а если не инициализировать массив этого же типа, то там в каждой ячейке значение -52 или же ему соответствующая русская "М"?
int main(){
    setlocale(0, "");
    char  x[10];
    cout << x[2];
    system("pause");
}

Если тоже самое проделать с int, то в ячейке будет -858993460.
Второй день только изучаю C++, отсюда и такие тупые вопросы.

Потому что переменная — это имя области памяти, выделенной для этой переменной тем или иным способом. При выделении памяти, в общем случае, её содержимым является мусор: случайные значения. (То, что в твоём случае там оказываются вполне определённые значения — особенности работы твоего компилятора.) Понятно, что при работе с неинициализированной переменной (читай — со случайным значением) ничего хорошего получиться не может.

По поводу особенностей работы твоего компилятора: память для переменной (char x[10] или int) выделяется в области памяти, все байты которой имеют значение 0xCC (в двоичном виде 11001100). Поэтому значение "неинициализированной переменной типа char будет 0xCC (16-ричное значение), или 204 (беззнаковое десятичное значение), или -52 (знаковое десятичное значение), или символ «русское М большое». А значение переменной типа int (размером 4 байта) будет 0xCCCCCCCC, или 3 435 973 836 (беззнаковое десятичное значение), или -858 993 460 (знаковое десятичное значение). Собственно, значение, которое ты и получил: тип int — это знаковый тип.

Лично я, посоветовал бы вам Вадим, начать читать какую нибудь книгу по С++ (Прата, Дейтел, Страуструп (основатель языка С++, кстати) и т.д.) и прочитать как минимум глав 5, ну а потом задавать вопросы, не тупые, а по теме ;).
Что касается вашего вопроса.

char  x;

Здесь вы объявили переменную типа char и под эту переменную ОС гарантировано выделяет 1 байт памяти, которая, в свою очередь, располагается по определенному адресу, в котором уже хранится какая-то информация (проще говоря «мусор»). Значение не инициализированной переменной не обязательно будет 52, как в вашем случае, оно будет отличаться от системы к системе. А компьютер, как вы знаете, вещь очень точная и работать со всяким там «мусором» не будет, поэтому и нужно инициализировать переменные, и ответственность за это лежит полностью на программисте.

Если тоже самое проделать с int, то в ячейке будет -858993460.

По поводу значения типа int все тоже самое. Почему разные значения? Потому что вся информация в компьютере хранится в виде чисел (даже буквы) и разные типы данных имеют различный размер. Конкретно тип char имеет размер от -128 до 127 (-52 соответствует русской букве 'M'). Размеры различных целочисленных переменных можно посмотреть подключив заголовочный файл climits, а информацию о числах с плавающей точкой в заголовочном файле float.

Здесь вы объявили переменную типа char и под эту переменную ОС гарантировано выделяет 2 байта памяти

Alf, выделяется один байт.

Alf, выделяется один байт.

Sorry, за «очепятку» , совершенно верно, под тип char выделяется один байт памяти :).

Насколько я помню, Страуструп утверждает, что размер char не всегда равен одному байту.

Предпологается, что в конкретной реализации размер char будет наиболее подходящим для хранения и манипулирования символами на данном компьютере; обычно это 1 байт. ... Например, есть машины с 32-битным типом char.

Все можно проверить, применимо к конкретной ОС, подключив заголовочный файл climits.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.