2017-01-21 7 views
-10
int a[10]; 

Приведенный выше код создаст массив из четырех значений переменной int &, таким образом, программа сможет хранить только 4 целых числа. Теперь рассмотрим следующие командыКак распределение динамической памяти выделяет память во время выполнения?

int *a,*b,*c,*d; 
a= (int *)malloc(sizeof(int)); 
b= (int *)malloc(sizeof(int)); 
c= (int *)malloc(sizeof(int)); 
d= (int *)malloc(sizeof(int)); 

выше часть кода будет создавать четыре типа Int указатель & выделит им память Int размера. Я узнал, что распределение динамической памяти выделяет память во время рома. Я хочу знать, что независимо от использования массива или malloc (динамическое распределение памяти), пользователь будет получать только четыре пространства для хранения по умолчанию. Если мы исключаем, что это указательная переменная с памятью размера int, то что будет использование распределения динамической памяти. В обоих случаях пользователь получит только четыре пробела &, чтобы получить больше ему потребуется получить доступ к исходному коду. Поэтому почему мы используем распределение malloc или динамической памяти?

+4

Я не вижу связи между '10' и« способным хранить только 4 целых числа ». –

+1

Вы можете изменить количество динамически распределенной памяти _at run time_. – ForceBru

+3

Здесь очень много концепций для очистки здесь. Я рекомендую вам проверить [Окончательный справочник по C++ и список] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) – WhiZTiM

ответ

1

Рассмотрим

int a,*b; 
cin >> a; 
b= (int *)malloc(a*sizeof(int)); 

пользователь вводит номер a и получает a Интс. Число a не известно ни программисту, ни компилятору.

Как указано в комментариях, это по-прежнему плохой стиль в C++, если возможно, используйте std::vector. Даже new по-прежнему лучше, чем malloc. Но я надеюсь, что (плохой) пример поможет прояснить основную идею динамического распределения памяти.

+3

Eww для литья в стиле C. –

+2

Да, так как вопрос помечен C++, нужно использовать вектор или подобное в любом случае .... – Anedar

+3

Посыпку 'new' по всей программе обескураживают в современном C++, чтобы не говорить о' malloc' – WhiZTiM

0
int a[10]; 

выше строка кода будет выделять массив из 10-х int автоматической продолжительности хранения, если это было в пределах локальной области.

int *a,*b,*c,*d; 

выше, однако, будет выделять 4 указатели на int также автоматической продолжительности хранения, аналогично, если это было в пределах локальной области.

a= (int *)malloc(sizeof(int)); 
b= (int *)malloc(sizeof(int)); 
c= (int *)malloc(sizeof(int)); 
d= (int *)malloc(sizeof(int)); 

И, наконец, выше будет выделять int переменную за каждый указатель динамически. Таким образом, каждый указатель выше будет указывать на одну переменную int.

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

+0

Что такое «локальная функция», ? –

-1

Если вы программируете на C, то отличать результат malloc не нужно. Предлагаю вам прочитать следующее: Do I cast the result of malloc?

Тогда ваши действия в коде с четырьмя указателями не нужны; на самом деле вы можете просто выделить массив 4 int с одним malloc:

int *a; 
a = malloc(4 * sizeof(int)); 
0

Вы правы, что это всего лишь память. Но есть разница в использовании.

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

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