c - 初始化数组中的结构
问题描述
最近,我尝试了以下方法,作为初始化新结构并使其成为数组的第一个元素的简写:
#include <stdio.h>
#define MAX_CARS 100
typedef struct car {
int wheels;
int cylinders;
int maxSpeed;
int canOffroad;
} Car;
int main(void) {
Car all_cars[MAX_CARS];
// This is nice, I would like to do something equivalent to this
all_cars[0] = {.wheels = 4,
.cylinders = 8,
.maxSpeed = 120,
.canOffroad = 0};
return 0;
}
但是,这会引发编译器错误,表示它需要在“{”之前有一个表达式。
现在,起初我以为我可能记错了初始化结构,但这有效:
#include <stdio.h>
#define MAX_CARS 100
typedef struct car {
int wheels;
int cylinders;
int maxSpeed;
int canOffroad;
} Car;
int main(void) {
Car all_cars[MAX_CARS];
// This is ok, but introduces a (potentially) unnecessary variable
Car new_car = {.wheels = 4,
.cylinders = 8,
.maxSpeed = 120,
.canOffroad = 0};
all_cars[0] = new_car;
return 0;
}
所以问题显然在于将该结构初始化为数组的元素而不是变量。
是否有允许初始化这样的结构的语法,或者每次我想将一个新的结构变量添加到数组中时,我是否都坚持初始化一个新的结构变量?
解决方案
问题是您尝试初始化数组中的元素,这只有在定义数组时才有可能。
初始化只能通过定义进行。
但是,您可以使用复合文字来创建一个临时结构对象,然后将其复制到数组元素中:
all_cars[0] = (Car) {.wheels = 4,
.cylinders = 8,
.maxSpeed = 120,
.canOffroad = 0};
推荐阅读
- flutter - Flutter Web:像 YouTube 一样全屏播放视频
- css - CSS:为什么忽略 Flex 间隙?
- javascript - 如何将几个base64数据添加到输入中 - js
- java - OWASP 依赖检查,如何使用抑制
- .net - 在 Visual Studio 2022 中发布应用程序失败
- javascript - 异步条形码图像加载到画布中并在使用 quagga 处理后
- swift - SwiftUI ForEach 文本填充在元素下方添加了额外的间距
- android - Exoplayer 无法在诺基亚 G10 中播放视频
- curl - 即使带有 --doh-url 标志的 DNS over HTTPS 请求,如何使 curl 使用相同的接口?
- php - Symfony 5 - 从数据库中过滤一些实体以获取 collectionType