Массив строк в структуре

/* Есть структура */

typedef struct {

    const char **links;

} strings;


int main() {
    
    strings S;
    
    const char *arr[] = {"abc", "def"};
    
    /* Почему можно сделать так */
    
    S.links = arr;
    
    /* И нельзя сделать так? */
    
    S.links = {"abc", "def"};
}

Ответы (1 шт):

Автор решения: AlexGlebe

В первом варианте

S.links = arr;

полю links присваивается массив. Массивы автоматически переводятся в тип указатель на первый элемент если надо. В вашем случае char const *[] => char const **. То есть S.links указывают на arr. Это не копирование, а ссылка.

Во втором случае

S.links = {"abc", "def"};

вы создаёте структуру неизвестного типа или массив чего-то и хотите куда-то присвоить. Сначала нужно указать тип вашего объекта {"abc", "def"}. Например такой :

S.links = (const char *[]){"abc", "def"};

У вас создаётся временный массив указателей на строки. И массив переконвертируется в адрес первого элемента. Теперь S.links хранит адрес этого массива. Этот массив как временный объект будет храниться в стеке и адрес будет неадекватен при выходе из функции.

В обоих случаях вы создаёте временный массив до выхода из функции и берёте адрес временного массива. Никакого копирования строк не будет.

→ Ссылка