So * ширина размер первого измерения туринг, поэтому она должна быть размер второго измерения newg.
Аналогично * высота должна быть размером с newg первой, и, следовательно, два набора размеров malloc были перевернуты неправильно.
Я думаю, что было бы яснее назвать значения orig_max_x и orig_max_y, тогда должно быть ясно, если функция использует значения неправильно.
newg = malloc (*height * sizeof(char *));
// Initialise each column
for (x = 0; x < *height; x++) {
newg[x] = malloc (*width);
for (y = 0; y < *width; y++)
newg[x][y] = 0;
}
Кроме того, он должен не освобождает любой хранения NEWG, если вы хотите, чтобы вернуть значения из spin()
Edit: я до сих пор некоторые из этих надоедливых * ширина и высота * неоднозначными. Сожалею. Я настоятельно рекомендую, чтобы имена были связаны с тем, о чем они говорят, orig_width, . Orig_height помог бы мне прочитать код.
Это, вероятно, как бы я это сделать:
#include <stdio.h>
#include <stdlib.h>
char** alloc_rectangle(int *width, int *height);
void free_rectangle(char **orig, int *width);
char** spin (char **orig, int *width, int *height);
int main (int argc, const char * argv[]) {
int width = 20;
int height = 30;
char** orig = alloc_rectangle(&width, &height);
char** newg = spin(orig, &width, &height);
return 0;
}
char** alloc_rectangle(int *width, int *height)
{
char **newg = calloc (*width, sizeof(char *));
// Initialise each column
for (int x = 0; x < *width; x++) {
newg[x] = calloc (*height, sizeof(char));
}
return newg;
}
void free_rectangle(char **orig, int *width)
{
// free memory for old grid
for (int x = 0; x < *width; x++) {
if (orig[x] != NULL) {
free (orig[x]);
}
}
free (orig);
}
char** spin (char **orig, int *width, int *height)
{
int x;
int y;
char **newg = alloc_rectangle(height, width);
// Rotate
for (x = 0; x < *width; x++) {
for (y = 0; y < *height; y++)
if (orig[x] != NULL)
newg[*height - 1 - y][x] = orig[x][y];
}
return newg;
}
ПРЕДУПРЕЖДЕНИЕ неопробованные код - некоторое удовольствие для всех :-)
Я не думаю, что это работа рассказывать или пис`ать на свободный ориг , Я бы предпочел, чтобы он просто сделал пространство, чтобы удержать результат вращения. Поэтому, чтобы сделать вещи более аккуратными, я вытащил прямоугольник в свою собственную функцию. Точно так же я всегда хотел бы, чтобы прямоугольники были распределены последовательно, так что это была бы его собственная функция.
Любопытство, есть причина, по которой вы не malloc всей сетке сразу, а malloc это линии за строкой? – thb
Но он может освободить() всю память, не так ли? К концу функции не может быть ничего, поэтому он может segfault (при втором вращении). – gbulmer
Вставляя диагностические printfs в стратегических точках вашего кода, можете ли вы определить, где произошла ошибка? – thb