Главная страница


ru.linux

 
 - RU.LINUX ---------------------------------------------------------------------
 From : Antony Y. Bolotin                    2:5020/400     22 Jun 2001  21:50:36
 To : All
 Subject : Re: bug in gcc
 -------------------------------------------------------------------------------- 
 
 Hi
 
 >> char *tra-la-la(unsigned long addr)
 >> {
 >> char sss;
 >> sss=(char *)malloc(sizeof("123"));
 >> sprintf(sss,"%03d",addr);
 >> return (sss);
 >> }
 
 > А где там ошибка?
 
 Как я уже говорил в соседней мессаге, ошибка в объявлении "char sss".
 Угадай, какая :))
 В том письме я написал, что странно, что оно выдает 010,010,30, а не 
 020,020,30.
 Вот сейчас вспомнил - всё правильно, так оно и должно выдавать :))
 Поскольку C/C++ передает параметры не слева на право, а справо на лево, то
 сначала передается 30, затем указатель, полученный от tra-la-la(20), а уж
 потом указатель полученный от tra-la-la(10) (это важно). А теперь смотрим,
 что получается при вызовах функции.
 
 Делаем malloc, записываем адрес в стек по адресу переменной sss. Потом
 что-то с ним делаем и выходим из функции с возвратом этого адреса. То есть,
 указатель на поле в стеке (!!!). Затем вызываем ее еще раз. Очень большая
 вероятность того, что адрес переменной sss в стеке не изменится.
 В результате мы получаем 2 абсолютно одинаковых указателя и лики памяти
 минимум на 8 байт. Под DOS были бы лики на 32 байта.
 
 А всё почему - всё потому, что sss объявлен символом, а не указателем на 
 символы. Именно поэтому sprintf пишет строку по адресу переменной, а не по 
 адресу, который записан в этой переменной (полученный от malloc).
 
 Попробуй заменить "char sss" на "char *sss" - всё сразу заработает :))
 
 Вывод - следить за кодом надо. Была бы программа больше - еще не такие 
 глюки могли бы быть :))
 
 ---------------------------------------------------
 С наилучшими пожеланиями...
 --- ifmail v.2.15dev5
  * Origin: MMX (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 глюкавый gcc   Nikolai Preminin   20 Jun 2001 22:33:10 
 Re: глюкавый gcc   Ruslan Skripka   21 Jun 2001 00:00:21 
 Re: глюкавый gcc   yx   21 Jun 2001 06:23:49 
 глюкавый gcc   Nikolai Preminin   22 Jun 2001 23:14:40 
 Re: люкавый gcc   yx   23 Jun 2001 01:47:32 
 Re: люкавый gcc   Serge A. Suchkov   25 Jun 2001 12:30:21 
 Re: лукавый gcc   Bohdan Vlasyuk   26 Jun 2001 12:21:07 
 Re: люкавый gcc   Yuriy Kaminskiy   26 Jun 2001 14:50:39 
 Re: глюкавый gcc   Boris Tobotras   21 Jun 2001 08:51:49 
 глюкавый gcc   Vitty Kuznestsov   21 Jun 2001 12:04:22 
 Re: bug in gcc   Oleg Milantiev   21 Jun 2001 18:35:47 
 Re: bug in gcc   yx   21 Jun 2001 21:09:27 
 bug in gcc   Nikolai Preminin   22 Jun 2001 22:57:04 
 Re: bug in gcc   Antony Y. Bolotin   22 Jun 2001 21:50:36 
 Re: bug in gcc   Alexandre N. Safiullin   22 Jun 2001 15:51:43 
 bug in gcc   Alexander S Aganichev   21 Jun 2001 22:48:09 
 Re: bug in gcc   Ilya Anfimov   22 Jun 2001 21:02:00 
 bug in gcc   Alexander S Aganichev   23 Jun 2001 00:03:26 
 Re: bug in gcc   yx   24 Jun 2001 01:50:08 
 Re: bug in gcc   Ilya Anfimov   25 Jun 2001 11:25:28 
 bug in gcc   Alexander S Aganichev   25 Jun 2001 23:46:30 
 Re: bug in gcc   Antony Y. Bolotin   22 Jun 2001 20:39:48 
 Re: глюкавый gcc   Vitaly Lugovsky   27 Jun 2001 16:27:03 
Архивное /ru.linux/12005ed0f5880.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional