Я собираюсь добавить ответ Адама здесь, потому что это, вероятно, не вписывается в комментарий. Адам совершенно прав. Я подозреваю, что ваша функция generate_fields, однако, возможно, на самом деле получает информацию от пользователя, я не уверен. В любом случае, есть два подхода к этому:
char ** generate_fields(char *, int num_fields, int size_of_field)
{
char ** options = malloc(num_fields*sizeof(char *));
for(int i = 0; i < num_fields; i++)
options[i] = malloc(size_of_field);
return options;
}
и соответствующую бесплатную функцию, которую я опущу для краткости. Вы можете видеть, что происходит - мы передаем количество полей и размер поля. Измените это вокруг, как вам нужно. Другой вариант заключается в том, чтобы сгенерировать поля, передаваемые обратно подпрограмме, которая вызывается из размера массива. Я бы сделал что-то вроде этого:
int generate_fields(char** options)
{
int num_fields = 0;
// somewhere here we get num_fields
options = malloc(num_fields*sizeof(char *));
for(int i = 0; i < num_fields; i++)
options[i] = malloc(size_of_field);
return num_fields;
}
И вы звоните с основного так:
int main()
{
int sizeofarray = 0;
char** fields;
sizeofarray = generate_fields(fields);
Или, если вам не нравится эта запись, вы всегда можете придерживаться того, что у вас было:
char** generate_fields(int* size)
В качестве прототипа функции (верните параметры на этот раз и сделайте size=
где-нибудь в коде и вызовите из main следующим образом:
int sizeofarray = 0;
char** options;
options = generate_fields(&sizeofarray);
Надеюсь, что это даст вам еще больше идей, Адам, не стесняйтесь редактировать все / все это в своем ответе соответствующим образом, в любом случае, это будет ваш ответ.