繁体   English   中英

c 同时初始化数组和结构体

[英]c initialize array and structs at the same time

我正在尝试初始化一个数组和它包含的结构

#include <stdio.h>
#include <math.h>

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

void edges(int height, int width, RGBTRIPLE image[height][width]);

int main()
{
    int height = 3;
    int width = 3;
    RGBTRIPLE image[height][width] = {
        {{0, 10, 25}, {0, 10, 30}, {40, 60, 80}},
        {{20, 30, 90}, {30, 40, 100}, {80, 70, 90}},
        {{20, 20, 40}, {30, 10, 30}, {50, 40, 10}}
    };
    return 0;
}

我不确定这种初始化是否可以同时发生,或者我是否必须先初始化所有结构,然后再将它们插入数组。

在定义数组时,您可以为数组中的元素(包括数组中结构的成员)赋予初始值。

C 标准规定正在初始化的事物不应具有可变长度数组类型(C 2018 6.7.9 3)。 您的数组具有可变长度数组类型,因为heightwidth是变量,而不是 C 定义的常量。 要解决这个问题,您可以使用#define指令或enum声明来定义heightwidth

如果确实需要可变长度数组或动态分配的数组,则可以使用赋值语句为其元素赋值,包括使用复合文字为每个结构分配整个结构,如下所示:

image[i][j] = (RGBTRIPLE) { 0, 10, 25 };

但是,C 标准没有提供任何方法在可变长度数组或动态分配的数组创建过程中为其提供初始值。 通过优化,在创建数组后立即分配值可能等同于在创建期间初始化它们。

您的代码中的问题不是因为您有一个结构数组。 而是因为它是一个可变长度数组(VLA), VLAs不能被初始化

要解决此问题(假设您使用的是与 GCC 兼容的编译器,正如您使用__attribute__((__packed__))所暗示的那样),您可以将heightwidth “变量”声明为const

int main()
{
    const int height = 3;
    const int width = 3;
    RGBTRIPLE image[height][width] = {
        {{0, 10, 25}, {0, 10, 30}, {40, 60, 80}},
        {{20, 30, 90}, {30, 40, 100}, {80, 70, 90}},
        {{20, 20, 40}, {30, 10, 30}, {50, 40, 10}}
    };
    for (int h = 0; h < height; ++h) {
        for (int w = 0; w < width; ++w) {
            printf("%3d %3d %3d | ", image[h][w].rgbtBlue, image[h][w].rgbtGreen, image[h][w].rgbtRed);
        }
        printf("\n");
    }
    return 0;
}

这将编译,但有警告:

警告:可变长度数组折叠为常量数组作为扩展 [-Wgnu-folding-constant]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM