Массив строк в структуре
/* Есть структура */
typedef struct {
const char **links;
} strings;
int main() {
strings S;
const char *arr[] = {"abc", "def"};
/* Почему можно сделать так */
S.links = arr;
/* И нельзя сделать так? */
S.links = {"abc", "def"};
}
Ответы (1 шт):
В первом варианте
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 хранит адрес этого массива. Этот массив как временный объект будет храниться в стеке и адрес будет неадекватен при выходе из функции.
В обоих случаях вы создаёте временный массив до выхода из функции и берёте адрес временного массива. Никакого копирования строк не будет.