A char[2][32]
- это не char**
, а непрерывный блок памяти размером 2 * 32 байта.Это можно выделить, напечатав указатели:
printf("%p %p %p\n", strMat[0], &strMat[0], &strMat[1]);
Когда вы приводите тип к char**
, вы интерпретируете данные, содержащиеся в массиве, как адреса памяти, которые неизбежно ссылаются на недопустимую память.
Действительно, если вы попытаетесь распечатать неверный адрес, который, по вашему мнению, является правильным, например:
printf("%p\n", ((char**)strMat)[0]);
Вы получите 0x5453524946
, что, интерпретируемое как массив байтов, таких как 0x54 0x53 0x52 0x49 0x46
, приводит к 'T' 'S' 'R' 'I' 'F'
которая показывает проблему (символы поменялись местами, потому что я предполагаю, что у платформы немного порядковый номер).