Ваши приведения для возвращаемого значения malloc()
недействительны. Они должны быть int**
и int*
в первом случае и short**
и short*
во втором.
Когда вы приводите возвращаемое значение от malloc()
к short
, возвращаемый указатель усекается до значения short
, а затем присваивается указателю short*
, давая значение указателя, указывающее на недопустимый место в памяти. Поэтому вы получаете ошибку сегментации, пытаясь получить к ней доступ.
С int
вам повезло, поскольку на вашей платформе, скорее всего, sizeof(int)==sizeof(int*)
, так что указатель, возвращаемый malloc()
с приведенным значением int
, не усекается и все работает тихо. Скорее всего, это произойдет сбой аналогичным образом на 64-разрядной платформе.
Должно быть:
short **matrix;
matrix=(short**)malloc(sizeof(short*)*mat_w);
for (i=0;i<mat_w;i++)
matrix[i]=(short*)malloc(sizeof(short)*mat_h);
for (i=0;i<mat_w;i++)
for (j=0;j<mat_h;j++)
matrix[i][j]=0;
Если ваш код - чистый C (не C ++), вы можете пропустить приведение, как в C приведение от void*
к любому другому типу указателя допустимо.
short **matrix;
matrix = malloc(sizeof(short*)*mat_w);
for (i=0;i<mat_w;i++)
matrix[i] = malloc(sizeof(short)*mat_h);
for (i=0;i<mat_w;i++)
for (j=0;j<mat_h;j++)
matrix[i][j]=0;