Или так:
This shared conversation is generated by AI, for reference only.
Пример инициализации массива структур gcc
Вот несколько примеров инициализации массива структур в GCC (C/C++):
1. Базовый пример на C
c
#include <stdio.h>
struct Point {
int x;
int y;
char label[20];
};
int main() {
// Инициализация массива структур
struct Point points[3] = {
{10, 20, "Point A"}, // Первая структура
{30, 40, "Point B"}, // Вторая структура
{50, 60, "Point C"} // Третья структура
};
for (int i = 0; i < 3; i++) {
printf("%s: (%d, %d)\n", points[i].label, points[i].x, points[i].y);
}
return 0;
}
2. С указанием индексов (designated initializers, C99+)
c
#include <stdio.h>
struct Student {
int id;
char name[30];
float gpa;
};
int main() {
// Инициализация с указанием полей (можно в любом порядке)
struct Student students[3] = {
{.id = 101, .name = "Alice", .gpa = 3.8},
{.name = "Bob", .id = 102, .gpa = 3.5}, // порядок не важен
{.gpa = 3.9, .id = 103, .name = "Charlie"}
};
// Можно инициализировать не все элементы
struct Student partial[5] = {
[0] = {.id = 201, .name = "David", .gpa = 3.7},
[3] = {.id = 202, .name = "Eve", .gpa = 3.6}
// Остальные будут нулевыми
};
return 0;
}
3. Пример на C++
cpp
#include <iostream>
#include <string>
struct Person {
std::string name;
int age;
double salary;
};
int main() {
// C++11 и новее: uniform initialization
Person employees[3] = {
{"John Doe", 30, 50000.0},
{"Jane Smith", 25, 45000.0},
{"Bob Johnson", 35, 55000.0}
};
// С указанием полей (C++20)
Person managers[] = {
{.name = "Alice Brown", .age = 40, .salary = 70000.0},
{.name = "Tom Wilson", .age = 45, .salary = 75000.0}
};
for (const auto& emp : employees) {
std::cout << emp.name << ", " << emp.age << " years, $"
<< emp.salary << std::endl;
}
return 0;
}
4. Динамическая инициализация
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char title[50];
char author[50];
int year;
float price;
} Book;
int main() {
// Статический массив
Book library[2] = {
{"The C Programming Language", "K&R", 1978, 49.99},
{"Clean Code", "Robert Martin", 2008, 59.99}
};
// Динамический массив
int count = 3;
Book *dynamicBooks = malloc(count * sizeof(Book));
if (dynamicBooks) {
// Инициализация каждого элемента
strcpy(dynamicBooks[0].title, "Book 1");
strcpy(dynamicBooks[0].author, "Author 1");
dynamicBooks[0].year = 2000;
dynamicBooks[0].price = 29.99;
// Или через составной литерал (C99)
dynamicBooks[1] = (Book){"Book 2", "Author 2", 2005, 34.99};
// Использование designated initializer
dynamicBooks[2] = (Book){.title = "Book 3", .price = 39.99,
.author = "Author 3", .year = 2010};
free(dynamicBooks);
}
return 0;
}
5. Вложенные структуры
c
#include <stdio.h>
typedef struct {
int day;
int month;
int year;
} Date;
typedef struct {
char name[50];
Date birthdate;
float height;
} Person;
int main() {
// Инициализация массива с вложенными структурами
Person people[2] = {
{
"Alex",
{15, 7, 1990}, // Вложенная структура Date
175.5
},
{
"Maria",
{.day = 22, .month = 11, .year = 1985},
168.2
}
};
return 0;
}
6. Частичная инициализация
c
#include <stdio.h>
struct Config {
int timeout;
int retries;
char hostname[50];
int port;
};
int main() {
// Частичная инициализация (неинициализированные поля = 0)
struct Config configs[4] = {
{30, 3, "server1", 8080}, // Полностью инициализирована
{60}, // Только timeout, остальные 0
{.hostname = "localhost"}, // Только hostname
{} // Все поля = 0
};
// Специфичные элементы массива
struct Config specific[10] = {
[2] = {.timeout = 100, .port = 9000},
[5] = {.hostname = "example.com", .retries = 5},
[9] = {30, 3, "last", 80}
};
return 0;
}
Особенности GCC
Designated initializers (C99) - поддерживаются в GCC
Составные литералы (C99) - (тип){инициализатор}
Диапазоны в инициализаторах (GCC расширение):
c
int arr[10] = {[0 ... 4] = 1, [5 ... 9] = 2}; // GCC расширение
Все примеры совместимы со стандартами C99/C11 и C++11/C++14. Для компиляции используйте:
bash
gcc -std=c99 -o program program.c # для C
g++ -std=c++11 -o program program.cpp # для C++
-
- Здесь почти то же самое, а для случая инициализации при объявлении вообще то же. - Idler(Вчера, 22:58)