2016-01-30 5 views
4
#include<iostream> 
    using namespace std; 
    int main() 
    { 
    int i= new int; 
    cout<<i; 
    return 0; 
    } 

, когда я пытался присвоить Int Ценит осыпать его показывает ошибки: недопустимое преобразование из «междунара *» на «Int»Присвоить целое значение осыпать

, когда я присвоить значение Int указателя то он присваивается ему. Почему мы не можем присвоить значение int для heap.Yes я знаю как можно больше, не присваивая значение куче. Я посмотрел много сообщений stackoverflow, каждый из которых объяснял о int * p = new int [10]; Пожалуйста, объясните мне это. Спасибо за помощь.

+0

У вас неправильная декларация. объявите его как int * arr = new int [100]; –

+1

@RaviHirani: Нет !!!!!!!!! –

+0

Моя ошибка, int i = new int(); Is равно int i = 0; –

ответ

4

new int возвращает указатель на int, то есть int*. Присвоение его int является очевидным несоответствием типа.

Указатель, возвращаемый new T, указывает на ячейку памяти в свободном хранилище кучи a.k.a., который обеспечивает достаточное пространство для хранения одного объекта типа T. T - это произвольный тип здесь.

Ваш код может быть изменен так:

int* ptr = new int; 
*ptr = 1; 
cout << *ptr; // prints 1 

Не забудьтеdeleteвпоследствии!


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

int i = 1; 
+0

не «свободная» память, полученная через 'new'; вместо этого используйте C++ 'delete'. –

+0

@ MarcusMüller О, святое дерьмо, извините, путайте оба. Обновлено. – Downvoter

+1

Не волнуйся, не то, что катастрофично :) –

1
new int; 

выделяет памяти для одного междунара, инициализирует один Int в там, и дает вам указатель на это. Он не дает вам int, но указатель к int, следовательно int*.

Вы, вероятно, просто хотите сделать

int i = 42; 

или около того.

EDIT:

Конечно, Вы можете также сделать

int* i = new int; 

, но, как вы используете его, вы не должны делать это. Память получена через new остается выделенной до вас delete it; это означает, что вы закодировали утечку памяти, если вы использовали new без delete.

+0

Нет, я просто хочу очистить свою концепцию от того, что я могу сделать так, – InvI

+0

вы также можете сделать 'int * i = new int;' конечно, но только если вам действительно нужна свежая выделенная переменная. Вы действительно должны прочитать о различиях между указателями и переменными и о том, что делает «новый». –

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