C - Получить копию содержимого char *? - PullRequest
0 голосов
/ 24 октября 2018
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, " ");
    exampleStruct[i].name = exampleString;
}

Как я могу получить содержимое exampleString и сохранить его в exampleStruct [i] .name в каждом цикле?Когда я в настоящее время делаю это, непосредственно устанавливая его, он устанавливает все значения exampleStructs на одно и то же (что было последней итерацией цикла).

Я понимаю, что это связано с какими-то указателями, я думаю, но я не уверен, как с этим справиться ..

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

А как же:

exampleStruct[i].name = strdup(exampleString);
0 голосов
/ 24 октября 2018

Кажется, проблема в том, что «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 ().

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