Почему массивы в Си заполняются «М»?
Uninitialized variables are not set to zero; they are initialized to special fill patterns, 0xcc and 0xcd (depending on whether the memory was allocated on the stack or the debug heap). The debugger can also be configured to break when uninitialized memory is read (though there are probably some restrictions on when this feature can be used)

В вашем случае 0xcc
Компилятор заполняет неициализированные переменные именно этим значением, что бы отлавливать значения которые не были инициализированы. Поэтому бывает забавно. В дебаге работает, а в релизе нет.
Не заполняются они М.
Если объявляется массив автоматический на стеке без инициализатора, то просто отводится память на стеке (уменьшение/увеличение регистра счетчика стека), никаких "теневых" присваиваний элементам не происходит, элементы массива принимают те значения, которые были в этих ячейках памяти ранее.
То же самое и с динамическим массивом, только механизам выделения памяти другой.
По любому адресу в памяти всегда находится какое-то значение, даже если эта память еще не выделена, просто потому что плашка  памяти уже вставлена в материнку и на нее подано питание.

Возможно в вашем случае это и не случайность - вы же не приводите код, которым выделяете память.