2010-10-24 2 views
3

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

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

Неясно, каков ваш вопрос. Ваш код уже делает что-то действительно; каждый элемент 'names []' указывает на 'char', выделенный в куче. Что вам на самом деле нужно делать? –

+0

Как только у вас есть это правильно, см. Этот вопрос о том, как освободить память: http://stackoverflow.com/questions/1733881/c-correctly-freeing-memory-of-a-multi-dimensional-array – Tim

ответ

9

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

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

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

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

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

+4

Do not введите возвращаемое значение из 'malloc()'. http://c-faq.com/malloc/mallocnocast.html – Tim

0

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

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

1

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

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

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

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

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

0

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

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

char *names[5]; 

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

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

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

Смежные вопросы