Преобразование комментариев в ответ.
В стандартном C вы не можете вернуть массив из функции — вы можете вернуть указатель OK (поэтому показанный код допустим, хотя он явно имеет проблемы с повторным входом и многопоточностью). Если вы не можете использовать static
или malloc()
и др., вам нужно передать массив функции, чтобы он заполнил ее вместо возврата массива. Затем вызывающая сторона несет ответственность за выделение пространства.
См. также srand() — зачем вызывать его только один раз.
То есть вы имеете в виду, что я могу установить глобальный массив в качестве аргументов функции и присвоить значение каждому элементу, чтобы я мог получить массив без использования static
и malloc
?
Да, или локальный массив, или массив любого другого типа, о котором вы хотите подумать. Я думаю, что подходящей реализацией может быть:
void getRandom(int n_vals, int *i_vals)
{
for (int i = 0; i < n_vals; i++)
i_vals[i] = rand();
}
но возможных вариаций легион. Вы можете восстановить печать, если вы действительно этого хотите; вы даже можете вызвать srand()
, если действительно хотите (но вы должны вызывать это только один раз). Затем вы можете использовать его как:
void somefunc(void)
{
int data[20];
getRandom(15, data);
…use data…;
}
or
static int data[20];
void somefunc(void)
{
getRandom(18, data);
…use data…;
}
или другие варианты (например, не использовать static
перед определением области файла data
— преобразование его в глобальную переменную). (Да, вы, вероятно, использовали бы 10, как в вопросе, или 20 как количество места в массиве, но 15 и 18 также являются допустимыми значениями в их контексте.)
person
Jonathan Leffler
schedule
09.08.2016
static
илиmalloc()
и др., вам нужно передать массив функции, чтобы он заполнил ее вместо возврата массива. Тогда ответственность за выделение пространства лежит на вызывающем абоненте. - person Jonathan Leffler   schedule 09.08.2016srand()
— зачем вызывать его только один раз. - person Jonathan Leffler   schedule 09.08.2016void getRandom(int n_vals, int *i_vals) { for (int i = 0; i < n_vals; i++) i_vals[i] = rand(); }
, но возможных вариантов множество. Вы можете восстановить печать, если вы действительно этого хотите; вы даже можете вызватьsrand()
, если очень хотите, но вы должны вызывать это только один раз. Затем вы можете иметьvoid somefunc(void) { int data[20]; getRandom(15, data); …use data…; }
илиstatic int data[20]; void somefunc(void) { getRandom(18, data); …use data…; }
или другие варианты. - person Jonathan Leffler   schedule 09.08.2016