Необычная структура в c - PullRequest
       4

Необычная структура в c

0 голосов
/ 05 января 2019

как понять массив из двух строк?

static struct S1 {
    char c[3], *s;
} s1 = {"abc", "def" };

Возможно, вопрос не правильный, но мне сложно понять, как это работает

Ответы [ 4 ]

0 голосов
/ 05 января 2019

Это не тот же код, но может помочь понять, что происходит, в первую очередь это не массив. Структура имеет 2 элемента.

#include <stdio.h>

struct S1 {
    char c[3];
    char* s;   
};

int main(void) {
    struct S1 s1 = { .c = "abc", .s = "def" };
    printf("s1.c: %.*s\n", 3, (char*) s1.c);
    printf("s1.s: %s\n", s1.s);
}
0 голосов
/ 05 января 2019

Инициализатор {"abc", "def" } не является массивом. В этом контексте он используется для инициализации экземпляра структуры.

0 голосов
/ 05 января 2019

Первый инициализатор "abc" копирует эти 3 символа в элемент char c[3]. Здесь нет места для ограничителя строки, поэтому он является простым массивом и не может рассматриваться как строка.

Второй инициализатор "def" копирует указатель на элемент char *s. Он указывает на строковый литерал "def", который помещается в постоянную память. Его можно рассматривать как строку, но нельзя изменить.

0 голосов
/ 05 января 2019

S1.c имеет место для 3 байтов, а S1.s - указатель на строку.

первая часть определяет структуру:

struct S1 {
    char c[3], *s;
};

Следующая часть создает экземпляр этого типа и инициализирует его несколькими значениями:

static struct S1 s1 = {"abc", "def" };

static не является частью определения структуры. Это относится к видимости переменной экземпляра.

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