с - динамическая память - PullRequest
       1

с - динамическая память

1 голос
/ 04 октября 2010

Привет всем с самого начала, спасибо всем вам за помощь.Теперь я хочу знать о двойном указателе.Я делаю код так:

int main()
{
    int **a;
    a = (int*)malloc(sizeof(*int)*5);
    for (i=0;i<5;i++)
    {
        a[i] = malloc(sizeof(int)*3);
    }
}

Теперь я не знаю, правильно ли я это делаю.Как я могу поместить значения в этот тип массива?Кто-нибудь может объяснить эту концепцию на примере?Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 04 октября 2010

Итак, вы выделили массив, эквивалентный по размеру:

int a[5][3];

Таким образом, чтобы ввести значения, вы просто делаете это так:

a[0][0] = 1234;

Что бы поместить значение в первый столбец первой строки и

a[4][2] = 9999;

поместит другое значение в последний столбец последней строки.

Поскольку вы используете malloc, вы также должны пройти через [i] от i = 0 до 4, и free(a[i]);, а затем free(a);, иначе ваша программа утечет память.

3 голосов
/ 04 октября 2010

Хорошо ... здесь у вас есть, в основном, указатель-указатель, а именно адрес адреса. Вы можете использовать этот тип переменной при работе с массивами.

Первые две строки вашего кода эквивалентны:

int* a[5]; // Declaration of an array of 5 integer pointers (a[0] till a[4]).

«Чистый» код C не использует переменную для размера массива, поэтому вы используете malloc, когда хотите динамически редактировать размер массива.

То есть, если в своем коде вы не собираетесь изменять размер своих массивов, вы используете очень сложный способ достижения очень простой цели. Вы можете просто набрать:

int a[5][3];

Но если вы не знаете размер вашего массива, вы должны использовать malloc (а затем и free). Что вы делаете, в основном, это:

  • Объявление массива массива;
  • Выделение памяти для x числа POINTER для целочисленных массивов;
  • Для каждого из этих указателей, выделяя память для y целых чисел.

Теперь, когда вы сделали это, вы можете нормально использовать свои массивы. Например:

a[1][0] = 1;

будет означать: в первом массиве [1] первая строка [0] равна 1.

Единственное отличие стандартного объявления, подобного приведенному выше, без использования malloc состоит в том, что, поскольку вы распределили память, вам придется ее освободить. Вот почему вы не хотите потерять свою переменную **. В конце вашей функции будет уничтожена переменная указатель-указатель, но не выделенная вами память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...