在 C 中将结构的二维数组初始化为零(将图像设置为全黑)

initializing a 2 dimensional array of struct to zero (set the image to all black) in C

我想将图像文件传递给函数并使其全黑。

这是我的做法:

typedef struct
{
    BYTE  rgbtBlue;
    BYTE  rgbtGreen;
    BYTE  rgbtRed;
} __attribute__((__packed__))
RGBTRIPLE;

void black(int height, int width, RGBTRIPLE image[height][width])
{
    RGBTRIPLE black_image[height][width];
    
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            black_image[i][j] = {0}; 
        }
    }
    
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            image[i][j] = black_image[i][j]; 
        }
    }
}

但是,我收到了相同的错误消息:

expected expression before '{' token black_image[i][j] = {0};
                                                         ^      

注意指针指向大括号。

我做错了什么?请帮忙。

{0} 是定义对象时用于初始化的语法。它不构成可用于赋值语句的表达式。

为此,您可以使用复合文字:

black_image[i][j] = (RGBTRIPLE) { 0, 0, 0 };

(这也可以作为 (RGBTRIPLE) {0},但列出所有三个组件可以更清楚地显示意图,并且可以避免编译器警告。)

因为你只是用它来将 image 设置为黑色,你可以去掉 black_image 和初始化它的循环,直接将 image 设置为零。

达到目标的最短路径是:

void black(int height, int width, RGBTRIPLE image[height][width])
{
    memset(image, 0, sizeof(RGBTRIPLE[height][width]));
}

除了现在的好答案之外,它完全解决了您的问题所带来的问题,并且作为简化的问题,据我所知,您有一个额外的不需要的循环和一个额外的不需要的数组,RGBTRIPLE black_image[height][width].

相反,您可以使用类似于 的复合文字将黑色结构直接分配给 image,但放弃 black_image 数组:

void black(int height, int width, RGBTRIPLE image[][width])
{
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            image[i][j] = (RGBTRIPLE){0, 0, 0}; //*
        }
    }
}

*如果你想在初始化时更加清晰,你可以使用指定的初始化器:

image[i][j] = (RGBTRIPLE){.rgbtBlue = 0, .rgbtGreen = 0, .rgbtRed = 0};

或者创建一个单一的黑色结构,并在循环中将其分配给数组中的每个元素:

void black(int height, int width, RGBTRIPLE image[][width])
{
    RGBTRIPLE black_image = {0, 0, 0}; //**

    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            image[i][j] = black_image;
        }
    }
}

**同样,您可以使用指定的初始化程序:

RGBTRIPLE black_image = {.rgbtBlue = 0, .rgbtGreen = 0, .rgbtRed = 0};

也就是说,这些是我首选方法的替代方法,使用 memset,已在 中提到。