Он принимает став 3-Star программатор
Вы можете легко выделить некоторое фиксированное число элементов (меньше максимального) в функции без пропускания количества элементов между функции вызывающего абонента и вызываемого абонента. Тем не менее, требуется создание массива указателей указателям на тип How/Why? По существу, вы обрабатываете свой массив как строку с завершающим нулем, изначально выделяя все указатели для ввода внутри массива NULL
и выделяя при этом пространство для них по мере необходимости. (выделение с помощью calloc
делает это привязкой). Когда массив используется обратно в вызывающем, он позволяет выполнять итерацию по всем значениям, пока вы не достигнете первого нулевого указателя.
Теперь предоставлен,
просто передавая указатель размера в качестве дополнительного аргумента для вашей функции имеет гораздо больше смысла [1]
и устраняет необходимость в трёх- но для целей примера, пользуйтесь 3-Star Программист для заказа:
#include <stdio.h>
#include <stdlib.h>
#define INITSZ 21
void alloco (int ***ppa)
{
printf("inside %s\n", __func__);
int i = 0;
/* allocate 21 pointers-to-int */
if (!(*ppa = calloc (INITSZ, sizeof **ppa))) {
fprintf (stderr, "%s() error: virtual memory exhausted.\n", __func__);
exit (EXIT_FAILURE);
}
/* allocate/fill 20 values (or anything less than 21) */
for (i = 0; i < INITSZ - 1; i++) {
if (!((*ppa)[i] = calloc (1, sizeof ***ppa))) {
fprintf (stderr, "%s() error: virtual memory exhausted.\n", __func__);
exit (EXIT_FAILURE);
}
*((*ppa)[i]) = i * 2;
}
}
int main()
{
int **app = NULL;
int i = 0;
printf ("inside main\n");
alloco (&app);
/*ISSUE::how will i know to traverse only 20 indexes?*/
while (app[i]) {
printf("app[%d] = %d \n", i, *(app[i]));
i++;
}
return(0);
}
Использование/выход
$ ./bin/alloc_array+1
inside main
inside alloco
app[0] = 0
app[1] = 2
app[2] = 4
app[3] = 6
app[4] = 8
app[5] = 10
app[6] = 12
app[7] = 14
app[8] = 16
app[9] = 18
app[10] = 20
app[11] = 22
app[12] = 24
app[13] = 26
app[14] = 28
app[15] = 30
app[16] = 32
app[17] = 34
app[18] = 36
app[19] = 38
сноска [1]: курсив в цитате для ясности, что это решение было предназначено, чтобы показать, что было возможно, не то, что было наиболее эффективным и наиболее практичным.
Если вам действительно нужно это сделать, не передавая размер, то вам нужно заполнить разделитель самостоятельно или вам нужно полагаться на конкретную реализацию платформы malloc для доступа к заголовку. –
C- «строки» ('char' array) заканчиваются' NUL' aka 'null' aka' '\ 0'', но, конечно же, не 'NULL', последнее - это нечто иное. – alk
Если этот шаблон встречается часто, вы можете захотеть иметь структуру, отслеживающую длину данных, на которые указывает ее второй элемент, указатель. Или вы используете язык, который имеет эту структуру в своей стандартной библиотеке ;-) –