Может кто-нибудь, пожалуйста, пояснить, о чем это меня просит?

#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])»