我有一个代表网格的2D指针设置,网格由包含1/0或空列的列组成(即在任何单元格中都不包含1)。此函数按顺时针方向旋转网格90度,工作方式如下:
我认为我的malloc可能是错误的,因为它工作正常,但我在dmalloc中得到了许多超越纠察栏的错误。
我是否分配了错误的内存量?
此外,我想交换*width和*height的值来表示网格的新宽度和高度,但当我尝试这样做时,程序只是在第二次旋转时出现分段错误。
发布于 2012-04-02 08:39:45
所以*width是orig的第一维的维度,所以它应该是newg的第二维的大小。
同样,*height应该是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;
}此外,如果您想从spin()返回值,则不应释放newg存储空间中的任何
编辑:我仍然有一些令人讨厌的*宽和*高混合。抱歉的。我强烈建议这些名称应该与他们谈论的东西相关,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;
}警告未经测试的代码-一些有趣的东西:-)
我不认为解救orig是spin的工作。我更喜欢它只是腾出空间来容纳旋转的结果。因此,为了使事情更整洁,我将一个矩形释放到它自己的函数中。类似地,我总是希望矩形的分配是一致的,所以这将是它自己的函数。
发布于 2012-04-02 08:18:09
再看一下旋转网格的代码。我认为你永远不会想把x和y坐标混在一起,所以像*width - 1 - y这样的索引看起来很可疑。例如,假设*width = 3和*height = 5。然后,y的范围从0到4,最后可以得到newg[3 - 1 - 4] = newg[-2]。
此外,如果您以与分配newg相同的方式分配orig,则需要像这样释放它:
for (x=0; x < *width; x++) {
free (orig[x]); // Free the individual columns
}
free (orig); // Free the array of pointers.发布于 2012-04-02 09:04:16
我只是快速地写下了这篇文章,我在上面运行了几个测试,它似乎工作得很好。
char **rotate(char **original, int *width, int *height)
{
int t_width = *height;
int t_height = *width;
char **newgrid = (char**)calloc(t_height, sizeof(char*));
for(int y = 0; y < t_height; y++)
{
newgrid[y] = (char*)calloc(t_width, sizeof(char));
for(int x = 0; x < t_width; x++)
newgrid[y][x] = original[x][y];
}
for(int y = 0; y < *height; y++)
free(original[y]);
free(original);
*width = t_width;
*height = t_height;
return newgrid;
}如果有什么问题,请告诉我。
https://stackoverflow.com/questions/9969472
复制相似问题