|
|
|
|
|
для: AndreyCh
(20.08.2008 в 22:10)
| | Пэ это вообще то не ссылка а указатель, это разные вещи. Ссылка обозначает адрес переменной и не имеет физической реализации, под нее не выделяется ячейка памяти, а указатель это переменная, ячейка памяти, которая содержит в себе адрес.
Так вот когда указатель неинициализирован, ячейка памяти образуется, а в ней 0! И разыменвание такого указателя приводит к обращению а адресу 0. Получаем известный Access Violation. | |
|
|
|
|
|
|
|
для: like-nix
(18.08.2008 в 03:49)
| | Да нет - в книге пример как НЕ надо писать в С,С++
это я для Like-nix | |
|
|
|
|
|
|
|
для: like-nix
(18.08.2008 в 03:49)
| | Опс, ни туда пыцкнул :) | |
|
|
|
|
|
|
|
для: cheops
(17.08.2008 в 12:21)
| | Да я не думал наводить критику :)
Просто расширил ответ
просто когда писалась книга - 2008 студии еще не было, это собст-но для автора темы... | |
|
|
|
|
|
|
|
для: GeorgeIV
(16.08.2008 в 22:46)
| | Дык эта, наэтапе компиляции формируется таблица переменных и таблица ссылок.
Компилятор просматривает их и находит, что есть переменная Хэ и ссылка Пэ
поэтому запись *p воспринимается как ссылка на ссылку Пэ, т.е. - работает дальше уже не с адресом, а со значением переменной т.е. инт(Пэ), которая не инициализирована.
Компилятору это фсеравно, sizeof(int) = 32 и адрес =32 bit, вдруг программер в Хэ засунет адрес?
Так что прокатывает компиляция, чего не скажешь о всем остальном
правильно будет | |
|
|
|
|
|
|
|
для: like-nix
(18.08.2008 в 03:49)
| | Тут вопрос еще контекста задачи. Если нужен синоним x тогда можно так, а если нужна независимая копия x, тогда надо инициализировать p и записать | |
|
|
|
|
|
|
|
для: DEM
(16.08.2008 в 16:14)
| | Может в книжке опечатка
может в книжке имелось ввиду p = x; опасно
вместо
int main()
{
int x, *p;
x = 10;
*p = x;
return 0;
}
|
имхо лучше использовать
int main()
{
int x, *p;
x = 10;
p = &x;
return 0;
} |
если проверять утилитой lclint первый вариант
выдается предупреждение
source.c: (in function main)
source.c:7:4: Variable p used before definition
An rvalue is used that may not be initialized to a value on some execution
path. (Use -usedef to inhibit warning) | |
|
|
|
|
|
|
|
для: AndreyCh
(16.08.2008 в 22:13)
| | >Имеется в виду в оперативной памяти - максимум что вам грозит, это синий экран смерти -
>это для NT-Based систем а если система вроде Win9X, то можно было и подвесить ее таким
>кодом, а... при настойчивости - обвалить
Можно, однако, я решил не упоминать это так как решил, если уж DEM использует Visual Studio 8, то Win9X явно и близко не пахнет - просто не встанет под эти версии. | |
|
|
|
|
|
|
|
для: AndreyCh
(16.08.2008 в 22:13)
| | а как так лихо у тебя из
*p= x
получилось *(*p)=x, а потом и вовсе (если отбросить приведение) p=x.
Это новые правила разыменования? | |
|
|
|
|
|
|
|
для: GeorgeIV
(16.08.2008 в 21:50)
| | Фактически для компилятора
int x, *p;
x = 10;
*(*p) = x;
|
т.е.
int x, *p;
x = 10;
(int)p = x;
|
здесь используется разименованная ссылка на p, фактически - переменная...
и адрес становится = 10 ?
а компилятор ругнулся, но остался не услышанным :)
warning C4700: uninitialized local variable 'p' used
а вот во время выполнения попрут усключения и программа рухнет
Имеется в виду в оперативной памяти - максимум что вам грозит, это синий экран смерти -
это для NT-Based систем а если система вроде Win9X, то можно было и подвесить ее таким кодом, а... при настойчивости - обвалить | |
|
|
|
|