-1

为什么不能在 C 中的函数中创建一个类似于我下面的数组?

int **image;
int height, weight;//initialized in a method not shown

void generateMatrices()
{
    image = (int **)malloc(sizeof(int*) * height);
    if(image == NULL)
    {
        fprintf(stderr, "Image matrix could not be made\n");
        exit(-1);
    }
    int y;
    for(y = 0; y < height; y++)
    {
        image[y] = (int *)malloc(sizeof(int) * width);
        if(image[y] == NULL)
        {
            fprintf(stderr, "Image matrix row %d could not be made\n", y);
            exit(-1);
        }
    }
}

int main(int argc, char* argv[])
{
    generateMatrices();
    image[height-2][width-2] = 90;//Fails here
    return 0;
}

首先,我想为提出这个不清楚的问题道歉。澄清一下,我确实知道如何制作这些矩阵,事实上,它确实有效。但是,所有这些代码最初都在我的主要语句中,我想通过将其放入各种方法来重构我的代码。其中一种方法名为 generateMatrices()。出于某种原因,即使矩阵被认为是全局的,并且即使它们存在于方法中,当我尝试从该方法外部访问它们时,例如在主要之后立即访问它们时,我得到一个段错误。

另一个编辑以进一步澄清代码。

事实证明,这段代码确实有效,而且我显然是在初始化height并且width 我调用了这个方法之后。浪费大家的时间是我的坏事。

4

4 回答 4

0

您发布的代码有效,但请注意它不会创建矩阵。如果你想创建一个矩阵,这个任务就更复杂了。

有两种简单的方法可以做到这一点,其中一种比另一种简单得多。

场景 1:其中一个界限在编译时是固定的。

这使您的代码非常简单,请考虑以下几点:

int (*image)[height] = NULL;
int width;

void generateMatrices()
{
    free(image); // in case it's already been allocated
    image = malloc(sizeof(image) * width); // you are done, you can now access the matrix
}

场景 2:多弹性边界

int **image = NULL;
int width, height;

void generateMatrices()
{
    if (image)
    {
        free(*image); // in case it has already been allocated
        free(image);
    }

    image = malloc(sizeof(int *) * width);
    image[0] = malloc(sizeof(int) * width * height);
    for (int i = 1; i < width; i++)
        image[i] = (image[0] + (i * height));
}
于 2012-06-13T17:00:48.247 回答
0

我怀疑你可能想要一个二维数组——而你只是在这里分配一个双指针的一维数组。

1) 生成一个指向指针的数组(int**);这有点像二维数组中的“标题”。2)第一个数组中的每个元素都指向另一个指针——第二个指针是一个一维数组,您可以将其视为二维数组或矩阵中的单行。因此,您循环遍历第一个数组(int**),然后执行另一个 malloc 为行 [(int*)'s] 创建一个数组,该数组是您想要的多列宽。

需要意识到的重要一点是,每个数组都可以被视为指向第一个元素的指针,并与第一个元素的偏移量相结合,并且指针可以指向其他指针。因此,您有一个指向行的指针数组,而每一行又是一个指针+偏移量(在您可能期望的传统数组意义上)。

试试这里的代码片段:http: //pleasemakeanote.blogspot.com/2008/06/2d-arrays-in-c-using-malloc.html

于 2012-06-13T17:04:27.890 回答
0

如果您从指向 [whatever] 的指针的指针开始,您可能不是在创建矩阵——您正在创建(实际上是分配)一个指针数组。然后(为了能够用它做任何事情)你必须为每个指向的指针分配一些空间。

int generateMatrices(int rows, int columns) {
    image = malloc(sizeof(int *) * rows;
    if (image == NULL)
        return 0;
    for (int i=0; i<rows; i++) {
        image[i] = malloc(sizeof(int) * columns);
        if (image[i] == NULL)
            return 0;
   }
   return 1;
}

您还需要提供一个destroyMatrices(或任何您喜欢的名称),它在反向上基本相同 - 遍历行,释放每一行,然后释放指针数组。

于 2012-06-13T16:54:47.807 回答
0

编辑后,二维分配似乎没问题。height和的值width 可能出错了。我在这里试过你的例子,它适用于正确的值heightwidth

于 2012-06-14T04:42:48.783 回答