Предположительно, вы захотите получить доступ к этим массивам позже.
Как таковой, вы теряете указатель на предыдущий массив, когда вы 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");
}
}
Динамическое выделение с использованием массивов / необработанной памяти означает, что вам нужно отслеживать вещи.Лучший подход на самом деле заключается в использовании связанного списка для ваших данных.В этом случае вы могли бы иметь связанный список узлов, каждый из которых содержал список целых чисел.