C 二维旋转阵列

C 二维旋转阵列,c,C,我有一个表示网格的2D指针设置,网格由包含1/0或空列的列组成(即任何单元格中不包含1)。此函数将栅格顺时针旋转90度,除 我认为我的malloc可能是错误的,因为它的工作,但我得到了许多在dmalloc纠察栅栏错误 我是否分配了不正确的内存量 我还想交换*width和*height的值,以表示网格的新宽度和高度,但当我尝试此操作时,程序只在第二次旋转时出现故障。再看一看旋转网格的代码。我认为你永远不会想要混合x和y坐标,所以像*width-1-y这样的索引看起来可疑。例如,假设*宽度=3和*高

我有一个表示网格的2D指针设置,网格由包含1/0或空列的列组成(即任何单元格中不包含1)。此函数将栅格顺时针旋转90度,除

我认为我的malloc可能是错误的,因为它的工作,但我得到了许多在dmalloc纠察栅栏错误

我是否分配了不正确的内存量


我还想交换*width和*height的值,以表示网格的新宽度和高度,但当我尝试此操作时,程序只在第二次旋转时出现故障。

再看一看旋转网格的代码。我认为你永远不会想要混合
x
y
坐标,所以像
*width-1-y
这样的索引看起来可疑。例如,假设
*宽度=3
*高度=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.
for(x=0;x<*宽度;x++){
free(orig[x]);//释放各个列
}
免费(原版);//释放指针数组。

所以*宽度是orig第一个维度的尺寸,所以它应该是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;
    }
警告未经测试的代码-给大家带来一些乐趣:-)


我不认为解放奥利格是斯普林的工作。我希望它能腾出空间来容纳旋转的结果。所以为了使事情更整洁,我将矩形释放到它自己的函数中。类似地,我总是希望矩形的分配保持一致,因此这将是它自己的功能。

我只是很快地写了这篇文章,通过在上面运行的几个测试,它似乎工作得很好

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;
}
char**旋转(char**原始,int*宽度,int*高度)
{
int t_宽度=*高度;
int t_高度=*宽度;
char**newgrid=(char**)calloc(t_高度,sizeof(char*);
对于(int y=0;y

如果有任何问题,请告诉我。

出于好奇,有什么原因你不一次对整个网格进行malloc,而是一行一行地对其进行malloc吗?但是它可以释放()所有内存,不是吗?在函数结束时,可能什么都没有了,因此它可以分离故障(在第二次旋转时)。通过在代码中的关键点插入诊断打印文件,您可以确定故障发生的位置吗?@thb-如果整个阵列是在一个阵列中malloc'd,则必须使用“手动”2D访问来访问它,即,而不是
newg[x][y]
它可能类似于
newg[*height*x+y]
@gbulmer是的,这就是为什么它不立即进行malloced。@user1277546:好吧,考虑一下:该循环中
y
的最大值是
*height-1
。当
y
具有该值时,
*宽度-1-y
的值是多少?是不是
*高度-*宽度
,可能是负数?@Adam Liss原始网格的列将设置为空,所以我认为当前的方式是一样的?@thb Hmmm。。。有没有更好的方法将2d阵列旋转90度cw?@user1277546:嗯,通常有更好的方法来做一些事情,我可能不会按照你的方式来做,但这并不重要。我们现在想要的是找到你的工作方式,有人怀疑这是可以做到的。然而,我认为亚当是对的。我认为您的代码有时会给出一个负数作为
newg[][]
的第一个索引。(@user1277546:既然你直接问了这个问题,是的,我个人觉得有更好的方法。为2D数组Malloc一个单一的,
width*height
大小的内存块,然后手动执行索引——或者编写一些合适的助手函数或预处理器宏来为你执行索引。通常是连续的内存块如果以我的经验为指导的话,在这样的应用中,我更愿意这样做。不过,我强调,我并不是想说服你放弃你的方法!这只是碰巧不是我可能会使用的方法。)我理解这一点,但即使在最初的malloc中使用*height而不是*width,我也会有很多内存泄漏。对不起,我做了一个不完整的工作,请再看看我的代码。
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;
}