Ваша проблема (вероятно) заключается в том, что функция strtok
возвращает указатель на строку, которую вы токенизируете.Он не создает для вас новую строку.
Это означает, например, что
field = strtok(NULL,";");
parameters[i]->name = field;
сделает parameters[i]->name
указателем на некоторый символ в buffer
.И как только функция readCSV
возвращает переменную buffer
, она завершает свое время жизни и перестает существовать, оставляя вас с неверным указателем.
Вам необходимо самостоятельно выделить память для строк и скопировать в них данные,Это делается либо путем создания массивов элементов структуры и использования strcpy
для копирования строки в эти массивы, либо с использованием нестандартной, но общедоступной функции strdup
(которая динамически распределяет память кучи и копирует строку вэто).
Есть еще одна проблема, связанная с возвратом ваших структур:
return *parameters;
равно
return parameters[0];
То есть вы возвращаете указатель наодна parameter
структура.
Если вы хотите вернуть весь массив, вы должны сделать
return parameters; // Return the whole array
Но обратите внимание, что он будет затухать до указателя на свой первый элемент (то есть ¶meters[0]
), имеющего тип struct parameter **
, поэтому вам необходимо соответствующим образом настроить тип возвращаемого значения.
Вам также нужно инициализировать parameters
для нулевых указателей, иначе будет трудно найтиконец массива:
static struct parameter *parameters[BSIZE] = { NULL };
Однако лучшее решение, которое я бы рекомендовал, состоит в том, чтобы передать массив в качестве аргумента и вернуть количество заполненных элементов. Затем вы можете использоватьмассив структурных объектов (вместо массива структурных указателей) и не требует динамического выделения ресурсов и риска утечки памяти.