|
|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/12005ed0f5880.html, оценка из 5, голосов 10
|