2012-03-03 2 views

ответ

4

Разница заключается в том, что первый не компилируется:

lol.cpp:2:10: error: cannot initialize a variable of type 'int *' with an rvalue of type 'int' 
    int *p1 = 10; 
     ^ ~~ 
1 error generated. 

а второй делает Int в куче со значением 10, и выделяет указатель на это значение в стеке.

Если первый один сделал компиляцию, скажем, если вы добавили бросок, он бы присваивая значение 10 для указателяp1, а это означает, что p1 будет указывать на адрес памяти 10 = 0x0A и *p1 бы попробовать для разыменования этого адреса как int, что было бы segfault. (Если вы использовали другой номер, который попал в пространство памяти вашего процесса, это было бы какое-то произвольное целое на основе содержимого содержащейся в нем памяти.)

+0

Это что, Clang? Я поздравляю вас с отличным выбором компилятора :) +1, так как это тоже правильно. – delnan

0

Выражение int* p1 = 10 не должно компилироваться: оно инициализирует указатель с целым числом!

0

Оба p1 и p2 являются указателями на целые переменные.

Инициализация p1 неверна. В качестве указателя он должен содержать адрес целочисленной переменной. И вы назначаете «адрес» значение «10»: вы устанавливаете его на адрес 0x0000000A, что почти наверняка недействительно.

1

И в соответствии с другой частью вашего вопроса. Нет, они не оба распределены в куче. На самом деле они оба выделены в стеке. Только второй указывает на область, выделенную на кучу оператором new. Они были бы распределены в куче, если бы они были частью объекта, привязанного к new.

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