Предположительно, вы захотите получить доступ к этим массивам позже.
Как бы то ни было, вы теряете указатель на предыдущий массив, когда вы malloc
выполняете следующий (и, конечно же, вызываете утечку памяти, если это более крупное приложение).
Вам нужно выделить часть int *
(набор указателей int
), а затем сохранить там каждый указатель int
.
Хитрость в том, что... если вы не знаете, сколько массивов вам понадобится, вам нужно, чтобы ваш код был динамичным (например, выделите некоторое количество места, а затем выделите больше, если оно закончится).
Другой вариант заключается в том, что вы можете ограничить количество серий, которые пользователь может ввести, и сообщить им, что они закончили, когда они его достигнут.
Вот некоторая помощь, если вы хотите пойти по последнему пути:
int i;
int n = 1;
int **myArrayOfArrays = malloc(sizeof(int*) * 5); /* max of 5 arrays */
int *arr;
int arrayCount = 0;
while(n != 0) {
scanf("%d", &n);
if(n == 0)
break;
else {
if (arrayCount == 4) {
printf("Woah there partner! That's enough!\n");
break;
}
else
{
arr = malloc(sizeof(int) * n);
for(i = 0; i < n; i++)
scanf("%d", &arr[i]);
myArrayOfArrays[arrayCount] = arr;
arrayCount++;
}
} //end if
} //end while
ОДНАКО... теперь вы не знаете, какова длина каждого массива. Что является проблемой. Вам нужно будет отслеживать это или использовать динамическую структуру, такую как связанный список. В приведенном ниже примере мы добавляем длину в качестве первого элемента каждого массива:
int main()
{
int i;
int n = 1;
int **myArrayOfArrays = malloc(sizeof(int*) * 5);
int *arr;
int arrayCount = 0;
while(n != 0) {
scanf("%d", &n);
if(n == 0)
break;
else {
if (arrayCount == 4) {
printf("Woah there partner! That's enough!\n");
break;
}
else
{
arr = malloc(sizeof(int) * (n + 1)); /* one more than we need */
arr[0] = n; /* store the array length in the first element */
for(i = 1; i <= n; i++)
scanf("%d", &arr[i]);
myArrayOfArrays[arrayCount] = arr;
arrayCount++;
}
} //end if
} //end while
int j;
for (i = 0; i < arrayCount; i++)
{
int length = myArrayOfArrays[i][0]; /* retrieve the length */
for (j = 1; j <= length; j++)
printf("%d ", myArrayOfArrays[i][j]);
printf("\n");
}
}
Динамическое выделение с использованием массивов/необработанной памяти означает, что вам нужно следить за вещами. На самом деле лучший подход — использовать связанный список для ваших данных. В этом случае у вас может быть связанный список узлов, каждый из которых содержит связанный список целых чисел.
person
Brian Roach
schedule
15.09.2011
break
вместоexit
. Это гарантирует выполнение любого другого кода после циклаwhile
. - person Mahesh   schedule 15.09.2011