выделение памяти для массива указателей - PullRequest
4 голосов
/ 24 октября 2010

Мне нужно выделить память для указателя, который должен использоваться в качестве двумерного массива. Я знаю, как распределить память для указателей на символы и указатели на int Я запутался, как память выделяется из массива указателей.причина будет очень полезной, а также код ниже?

char *names[5];
for(i=0;i<5;i++)
{
 names[i]=(*char)malloc(sizeof(char));
}

Ответы [ 4 ]

11 голосов
/ 24 октября 2010

Нет, это не потому, что вы выделяете массив, принимая размер только 1 элемента типа примитива char (который составляет 1 байт).

Я предполагаю, что вы хотите выделить 5 указателей на строки внутри names, но только указатели.

Вы должны выделить его в соответствии с размером указателя, умноженным на количество элементов:

char **names = malloc(sizeof(char*)*5);

Вам не нужно выделять их один за другим с помощью цикла. Обратите внимание, что вам нужно указать, что это указатель указателей, используя **

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

То, что вы делаете, выделяет место для 5 символов. Вы могли бы написать это, и это будет иметь тот же результат:

char *names = (char *)malloc(sizeof(char) * 5);

Если вы хотите иметь массив указателей, я думаю, что это будет лучший код

char **names = (char **)malloc(sizeof(char *) * 5);

Я не супер-кодер, но, как я и сейчас, это правильное решение.

0 голосов
/ 20 июля 2013

Подчеркивая сказанное Джеком в конце: его код работает, только если массив объявлен как указатель указателей с использованием **.

Когда массив объявлен как

char *names[5];

Полагаю, правильный способ выделения памяти почти такой же, как у Ak1to, но умножение на требуемый размер строки символов:

char *names[5];
for(i=0;i<5;i++)
{
  names[i]=(char *)malloc(sizeof(char)*80);
}

иначе компилятор выдает ошибку о несовместимых типах.

0 голосов
/ 24 октября 2010

Кроме того, в этом случае вы также можете выполнить следующее для выделения памяти для пяти символов

names = (char*)malloc(5 * sizeof(char))

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