#arrays #c #pointers #random #allocation
#массивы #c #указатели #Случайный #распределение
Вопрос:
Я понимаю создание массива (int** intptrArray[5]) и числовой части rand(). Однако я не понимаю предложение в середине — я знаю, что мне нужно сначала выделить массив, а затем присвоить каждому указателю в массиве значение int, но я не уверен, как это сделать, и я застрял на этом на несколько часов. Нужно ли мне использовать malloc здесь и как бы я это сделал?
Комментарии:
1. Спросите своего инструктора. Ваш учитель не может читать ваши мысли и не узнает, что вам нужен «толчок», если вы не попросите его или ее. Возможно, этот момент нуждается в разъяснении для нескольких человек в вашем классе! Но, если вы не спросите его или ее, (ы) у него нет возможности узнать.
2. Если я правильно понимаю вопрос, то
int** intptrArray[5]
это не ответ! Скорее всего, вы захотитеint** intptrArray = malloc(5 * sizeof(int*));
или что-то эквивалентное.3. (Да, я был инструктором, и «это одна из моих любимых обид».)
Ответ №1:
Требование
создайте массив int * (т.е. int **)
является противоречием. Объект может быть массивом или указателем, массивом указателей, указателем на массив или некоторой их комбинацией. Но указатель — это не то же самое, что массив, а массив — это не указатель, а указатель — это не массив. Массивы часто распадаются на указатели, когда вы обращаетесь к ним, но по-прежнему существуют 2 разных понятия.
Массив может иметь тип int *intptrArray[]
, тип int **intptrPtr
которого является указателем на указатель на int
, это включает в себя возможность указателя на массив указателей на int
, указателя на указатель на массив из int
или указателя на массив указателей на массивы из int
.
Требование
размера 5
вводит в заблуждение. Согласно стандарту C, размер объекта измеряется в байтах. Создание массива размером 5 с int *
часто невозможно, поскольку на многих платформах указатель имеет размер 4 или 8 байт. Стандарт C не ограничивает возможный размер указателя, поэтому возможен вариант 5, но я никогда не видел машины, которая поддерживает это. Я думаю, он имел в виду длину массива.
Я думаю, что лучше всего обратиться за разъяснениями к парню, который дал вам это требование.
Ответ №2:
Похоже, вам нужно объявить в области видимости файла переменную типа указателя int **, например
int **intptrArray;
затем в функции (например, в main
) вам нужно выделить массив 5
элементов такого типа int *
, как
intptrArray = malloc( 5 * sizeof( int * ) );
Затем в цикле каждый элемент массива должен быть инициализирован указателем, чтобы динамически выделять память для одного объекта данного типа int
.
А затем с помощью функции rand
вам нужно присвоить значения этим целым числам.
Например
for ( size_t i = 0; i < 5; i )
{
intptrArray[i] = malloc( sizeof( int ) );
*intptrArray[i] = rand();
}
Комментарии:
1. @12431234123412341234123 Массивы не имеют типа int **.
2. @12431234123412341234123 В присваивании написано «(т. е. int **)» В противном случае было бы написано «(т. е. int *[5])»