Синтаксис для присвоения значений указателю структуры - PullRequest
0 голосов
/ 04 мая 2019

У меня есть быстрый вопрос о синтаксисе и коде.

Я только что нашел способ объявить структуру в C, которая немного отличается от того, что я видел до сих пор.

Это пример кода:

#include <stdio.h>
struct student {
    int age;
    int grade;
    char* name;
};
int main () {
    struct student s = { .name = "Max", .age = 15, .grade = 8 };
    return 0;
}

Назначение переменных как .var_name работает нормально, и вы можете назначать их в любом порядке.Мне понравился этот подход, поэтому я начал экспериментировать и, таким образом, ударил стену.Если бы я объявил:

struct student *s = { ->name = "Max", ->age = 15, ->grade = 8 };

Это не сработает.Есть ли синтаксис, который может дать те же результаты при использовании указателя, как и код выше?

Спасибо!

1 Ответ

0 голосов
/ 04 мая 2019

Вообще говоря, вы не можете "присваивать значения указателю". Указатель хранит только одно значение, которое является адресом уже существующего объекта.

Если у вас есть указатель, указывающий на существующую переменную структуры, вы можете просто инициализировать это:

struct student s = { .name = "Max", .age = 15, .grade = 8 };
struct student *p = &s;

Если вы хотите использовать динамическое распределение памяти, все становится немного сложнее:

struct student *p = malloc(sizeof *p);
if (!p) {
    ...
}

malloc предоставляет вам неинициализированную память, и вы не можете использовать синтаксис инициализатора с существующими объектами.

Но вы можете использовать трюк с составными литералами (доступно с C99):

*p = (struct student){ .name = "Max", .age = 15, .grade = 8 };

Здесь мы используем составной литерал для создания нового безымянного объекта структуры, содержимое которого мы затем копируем в *p.

Эта же функция может быть использована для избавления от s в первом примере:

struct student *p = &(struct student){ .name = "Max", .age = 15, .grade = 8 };

Но в этой версии p все еще указывает на автоматическую память (как локальная переменная).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...