Перейти к содержимому

C 858993460 что это означает

  • автор:

Получение -858993460 в результате c++

Без инициализации массива, значение является случайным значением из стека.

Поделиться 12 ноября 2012 в 11:05

m[i]=a[ch] — это неопределенное поведение, потому что a — это массив неинициализированных int .

Вы никогда не читаете в a . Каким бы вы ожидали поведение?

Поделиться 12 ноября 2012 в 11:03

Вы не инициализируете элементы a и b нигде, поэтому они имеют довольно много случайного начального значения (например, -858993460, которое вы получаете).

C 858993460 что это означает

Сообщения: 59
Благодарности: 2

Ниже приведу код иллюстрирующий мой вопрос:

int main()
goto label;
auto int a;
label:
a = -32;
printf(«%d\n», a);
>

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

Цитирую из книжки (Программирование на языке СИ) на счёт объявления переменной с классом памяти auto (который я задал явным образом для иллюстрации):

Переменная с классом памяти auto имеет локальное время жизни и видна только в блоке, в котором объявлена. Память для такой переменной выделяется при входе в блок и освобождается при выходе из блока. При повторном входе в блок этой переменной может быть выделен друго участок памяти.

Что-то я не понял как выделилась память для переменной a если код объявления был пропущен с помощью оператора goto?

Сообщения: 3320
Благодарности: 916

Если ставить точку остановки на auto int a; то отладчик останавливается аж на a = -32; со значением а=-858993460 (компилятор в Visual C++2008 Express), а на printf уже с присвоенным -32.
Самое интересное, если вспомнить что return 0; ещё не хватает, но это не так важно для сабжа, и поставить его перед auto int a; выхода не происходит. Это мне напоминает Pascal, в котором отдельным пунктом есть секция var, и которая не выполняется при трассировки, но она указ компилятору.

Последний раз редактировалось Admiral, 14-06-2008 в 15:10 .

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

Если тоже самое проделать с 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, выделяется один байт.

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

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

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

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

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

C 858993460 что это означает

Здравствуйте, уважаемые программисты! Приходилось ли Вам копаться в «мусоре»? Мне приходилось.
Началось всё с того, как мне захотелось написать собственную реализацию strcat() и strlen() (разумеется в собственном пространстве имён) и я столкнулся с следующей проблемой.
В программе, тестирующей эти функции я объявил три строки:

char str1[80] = "Hallo!"; char str2[] = " How are you?"; char str3[80];

Как видите, первые две строки тут же инициализированы, а третья — нет (она вводится с клавиатуры).

Вот так я реализовал strcat:

void strcat(char* str1, const char* str2)

Вот strlen:

int strlen(const char *str)

Перед определением функций есть прототипы, так что, функции видят друг друга с этим проблем нет.
Для первых двух строк strcat сработала как надо, но когда я применил её к третьей:

strcat(str3, str2);

я узнал, что такое «мусор».
Оказалось, что str3 не содержит ни одного «завершающего нуля»! При объявлении, 3-я строка содержит 80 значений -52, беззнаковое представление которых есть 204 в ASCII это русская ‘M’ или ‘╠’. При в воде в строку str3 n символов (n<80), первые n 'М' заменяются на символы, введённые с клавы, а остальные не меняются! А при инициализации первой строки все "оставшиеся" символы равны 0, поэтому с ним проблем нет. В strcat пришлось дописать

str1[pos] = '\0';

Или нужно было объявить str3 как нуль-строку

 char str3[80] = "";

Теперь всё работает, но остались вопросы.

Итак, как я понял, значение -52 для char есть ничто иное как «мусор». Эксперимент даёт следующие результаты для «мусора» других типов:

char: -52 ‘М’ | short: -13108 | int: -858993460 | float: -107374176. | doule: -9.2559631349317831e+061

Как я понял здесь int и double расширяются до long-значений, т.к. для long и long double «мусор» идентичен соответствующим значениям для int и double.
Внимание! Bопросы:
1) Почему «мусор», который как я читал и считал должен иметь неопределённый результат имеет вполне определённые отрицательные значения?
2) Почему они именно такие?
3) Зависят ли эти значения от модели процессора, компилятора ОС или ещё чего?

Очень надеюсь на ответы. Заранее благодарен.

Последний раз редактировалось Haric_110; 06.08.2014 в 18:29 .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *