(предположим x86 на этом посту)
, что является причиной этого выхода?
Вот примерно то, что происходит, в сборке, когда вы делаете char x[50];
:
ADD ESP, 0x34 ; 52 bytes
По существу, стек перемещается вверх 0x34 байт (должно быть кратно 4).Затем это место в стеке становитсяx
. Там нет очистки, никаких изменений или толчков или попсов, просто это пространство становится x
. Все, что было до этого (оставленные параметры, обратные адреса, переменные от предыдущих вызовов функций), будет в x
.
Вот примерно то, что происходит, когда вы делаете new char[50]
:
1. Control gets passed to the allocator
2. The allocator looks for any heap of sufficient size (readas: an already allocated but uncommited heap)
3. If 2 fails, the allocator makes a new heap
4. The allocator takes the heap (either the found or allocated one) and commits it
5. The address of that heap is returned to your code where it is used as a char*
же, как со стеком, вы получите то, что данные есть. Некоторые программы или системы могут иметь распределители, которые обнуляют кучи, когда они выделены или переданы, когда другие могут иметь нулевое значение, если они выделены, но не зафиксированы, а некоторые могут вообще не иметь нуля. В зависимости от распределителя вы можете получить чистую память, или вы можете получить повторно использованную и грязную память. Вот почему значения здесь могут быть ненулевыми и не предсказуемы.
Есть ли способ избежать этого?
В случае динамической памяти, вы можете перегрузить new
и delete
операторы в C++ и всегда нулевой вновь выделенную память. Вы можете увидеть примеры перегрузки этих операторов here. Что касается памяти в стеке, вам просто нужно постоянно обнулять ее.
ZeroMemory(myArray, sizeof(myarray));
В качестве альтернативы, для обоих методов, вы можете остаться в стороне от открытого массива и использовать зЬй :: вектор или другие оболочки, которые берут на себя инициализацию для вас. Тем не менее, вы все равно захотите инициализировать целые числа и другие числовые или указательные типы данных.
в чем причина? - вы не инициализировали его. Есть ли способ избежать этого? - Да, инициализируйте его. – user463035818
Итак, есть ли короткий способ инициализировать его пробелами? – Schizo
https://www.google.de/search?q=init+char+array&ie=utf-8&oe=utf-8&gws_rd=cr&ei=NgRWVsacJorSU4L0vJgL – user463035818