So * Breite ist die Dimension der ersten Dimension des orig, soll es so sein sollte die Größe der zweiten Dimension von newg.
Ähnlich sollte die Höhe die Größe von Newgs zuerst sein, und daher wurden die zwei Sätze von malloc Größen falsch herum umgedreht.
Ich denke, es wäre klarer, die Werte orig_max_x und orig_max_y zu nennen, dann sollte es klar sein, wenn die Funktion die Werte falsch herum verwendet.
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;
}
Ferner sollte es keine von newg Storage-frei, wenn Sie Werte zurückgeben möchten von spin()
Edit: Ich hatte noch einige dieser lästigen * Breite und Höhe * gemischt. Es tut uns leid. Ich schlage vor, die Namen sollten sich auf die Sache beziehen, über die sie sprechen, orig_width, orig_height wäre mir geholfen, den Code zu lesen.
Dies ist wahrscheinlich, wie ich es tun würde:
#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;
}
WARNUNG Ungeprüfte Code - Spaß für alle :-)
ich es nicht glaube, ist Aufgabe des Spin kostenlos orig . Ich würde es vorziehen, einfach Platz zu machen, um das Ergebnis des Drehens zu halten. Um die Dinge besser zu machen, habe ich ein Rechteck in seine eigene Funktion gebracht. Ähnlich möchte ich immer, dass die Rechtecke einheitlich zugewiesen werden, so dass dies eine eigene Funktion wäre.
Aus Neugier, gibt es einen Grund, warum Sie nicht das gesamte Netz auf einmal malloc, sondern Malloc es Zeile für Zeile? – thb
Aber es kann die gesamte Speicher frei(), nicht wahr? Am Ende der Funktion ist möglicherweise nichts mehr vorhanden und kann segfault (beim zweiten Dreh). – gbulmer
Durch Einfügen von diagnostischen printfs an strategischen Punkten in Ihrem Code können Sie genau feststellen, wo der Fehler auftritt. – thb