gpt4 book ai didi

c - C中二维数组的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 08:21:28 24 4
gpt4 key购买 nike

我正在制作我们所说的整体图像,但我遇到了问题。当我达到一定数量时,我会出现段错误。图像是 273*273 有效,274*274 无效。所以我试着 Malloc 我的双数组。相同的。我看过函数中的数组在栈中,栈的空间很小。如何在内存中声明我的数组?

我正在使用 C99 和 SDL:

void integral_img(SDL_Surface * img)
{
int **M;

M = malloc(img->w * sizeof(int *));
for (int i = 0; i < img->w; i++)
{
M[i] = malloc(img->h * sizeof(int));
}
int sum_int = 0;
Uint8 sum = 0;

for (int i = 0; i < img->h; i++)
{
for (int j = 0; j < img->w; j++)
{
SDL_GetRGB(getpixel(img, i, j), img->format, &sum, &sum, &sum);

if (i == 0 && j == 0)
sum_int = (int)sum;
if (i == 0 && j > 0)
sum_int = (int)sum + M[i][j - 1];
if (j == 0 && i > 0)
sum_int = (int)sum + M[i - 1][j];
if (i > 0 && j > 0)
sum_int = (int)sum + M[i - 1][j] + M[i][j - 1] - M[i - 1][j - 1];
M[i][j] = sum_int;
}
}
}

最佳答案

  • 您分配的是基于指针的查找表,而不是二维数组。它会工作,但它是广泛传播的错误做法:它使程序不必要地变慢而没有任何好处。考虑改用二维数组:

    int (*M)[w] = malloc( sizeof(int[h][w]) );
    ...
    free(M);
  • 这里有一个错误:

    M = malloc(img->w * sizeof(int *));
    for (int i = 0; i < img->w; i++)
    {
    M[i] = malloc(img->h * sizeof(int));
    }

    在这里,您将查找表的最内层维度声明为 w,宽度。

    不过后来

    for (int i = 0; i < img->h; i++)
    {
    for (int j = 0; j < img->w; j++)
    ...
    M[i][j] = sum_int;

    你说最里面的维度是h,高度。

  • 此外,您的程序每次调用该函数时都会泄漏大量内存,因为您没有在任何地方释放内存。事实上,您似乎甚至在填写查找表后都没有使用它。

关于c - C中二维数组的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33214242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com