2014-02-14 3 views
1

Я получил этот кусок кода примера на лаборатории, и я пытаюсь понять этоПонимание таНос

int size = 5; 
int **ppi2 = (int **) malloc(size * sizeof(int *)); 

Вот мой пробой этого, как сейчас:

Для того, чтобы выделить достаточный объем памяти , мы должны умножить количество вещей, которые мы хотим выделить память (размер) на размер этих вещей (sizeof (int *)). Это очень просто и имеет большой смысл.

Я понимаю, что мы должны приводить результат malloc в двойной указатель, поскольку malloc возвращает байты, а переменная - двойной указатель, но почему мы устанавливаем ppi2 равным результату malloc в первую очередь? Означает ли это, что ppi2 указывает на то место в памяти, которое мы только что выделили?

+2

Прежде всего, [не выдавайте результат 'malloc'] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). – pzaenger

+0

Я программирую в прямолинейном C, поэтому я думаю, что я должен использовать его –

+0

Вам нужно направить результат в 'C++', но не в 'C'. Просто прочитайте принятый ответ в предоставленной ссылке. – pzaenger

ответ

0

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

Do not cast the return value of malloc.

Почему мы устанавливаем ppi2 равным результату malloc в первую очередь?

Чтобы указать то же местоположение, что и указателем, возвращаемым malloc.

Приводит ли ppi2 к месту в памяти, которое мы только что выделили?

Да.

0

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

таНос не возвращает байты; он возвращает указатель, который указывает на байты, которые он выделяет. Этот указатель имеет общий указатель типа void *. В C++ вы должны отбросить это значение void * обратно в тип указателя переменной, но в простом C этот листинг является необязательным.

но почему мы устанавливаем ppi2 равным результату malloc в первую очередь? Означает ли это, что ppi2 указывает на то место в памяти, которое мы только что выделили?

Да.

+0

В C++ обычно лучше использовать 'new', а не' malloc' - или, лучше, использовать один из стандартных классов контейнеров. –

+0

@ KeithThompson бедный бедный 'распределитель', никто их никогда не помнит: D. «Реальный» C++ способ выделения/освобождения памяти. – user2485710

1

С malloc вы передаете в качестве параметра количество байт памяти, которые вы хотите выделить, и возвращает адрес в начало выделенной памяти. С этим адресом, хранящимся в указателе, вы можете делать то, что вам нужно. Он не возвращает байты памяти, он возвращает адрес, чтобы вы могли перейти и манипулировать ими. Вот почему управление памятью C важно для понимания (вы как-то теряете этот адрес, вы «теряете» память).

Если вы хотите, чтобы получить лучшее понимание того, как malloc работает с памятью и ее отношениями с вашей программой (который я рекомендую, так как его фундаментальные знания), читал Chapter 13 системы оперативных книг Three Easy Pieces. Короче, это здорово.

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