Кажется, проблема в том, что «aString» - это одно и то же место в памяти для каждой итерации цикла, поэтому все элементы «exampleStruct [i] .name» указывают на одно и то же место, которое в конечном итоге имеет последнее значениецикл итерации.
Вам необходимо использовать разные области памяти для хранения каждой строки результата для каждой итерации.
Существует несколько альтернатив для разрешения этой ситуации.
Вы можете использовать strdup (), который будет дублировать строку результата в новой ячейке памяти "malloc-ed".Это не стандартная функция C, как описано здесь ( strdup () - что она делает в C? ).Также вы должны помнить, чтобы освободить () эту память после того, как вы закончите ее использовать.
[Существует также функция strdupa (), но она менее переносима, чем strdup (), как описано в этом вопросе strdupa() в C - Опасности и дубликаты ]
Если вы уже зарезервировали ячейки памяти для строк результата, вы можете использовать strcpy ().Это стандарт ANSI C.
Вы также можете вызвать malloc () самостоятельно перед копированием строки, используя memcpy (), как это.
struct Example {
char* name;
};
struct Example exampleStruct[5];
int i;
for (i = 0; i < 5; i++) {
//Pretend aString is a different random string each loop
char* exampleString = strtok(aString, " ");
size_t slen = strlen(exampleString) + 1; /* the +1 is to include the copy of the NULL character */
char* tstr = malloc(slen);
memcpy(tstr, exampleString, slen);
exampleStruct[i].name = tstr;
}
Помните, что у вас есть безопасные версии этих функций: strncpy() и strndup ().