Извините, но мне бы полный текст программы, с прототипами функции,
а то указатели я еще не совсем понимаю. И еще - если не сложно - можно ли
поучить какие-нибудь комментарии по этой фунцкии что есть malloc и как фунцкция работает?)
Извините, но мне бы полный текст программы, с прототипами функции,
а то указатели я еще не совсем понимаю. И еще - если не сложно - можно ли
поучить какие-нибудь комментарии по этой фунцкии что есть malloc и как фунцкция работает?)
Извините, но мне бы полный текст программы, с прототипами функции,
а то указатели я еще не совсем понимаю. И еще - если не сложно - можно ли
поучить какие-нибудь комментарии по этой фунцкии что есть malloc и как фунцкция работает?)
Ну, информацию по поводу malloc можно прочитать выполнив команду man malloc. А полный текст функции?.. Он и так достаточно полный (правда с ошибками - после malloc должны быть круглые скобки, а не квадратные). Если четко сформулируешь постановку задачи, можно будет и функцию поподробней расписать. :)
В libc уже есть функция дублирования строк:
char *strdup(const char *src);
Это для си. А с с++ тебе (автору вопроса), IMHO, рано пока еще дело иметь. Си все-таки попроще для начала.
Ай эм сорри, не увидел,честно говоря, что спрашивалось о С++... Поэтому лабал для С. И хотелось бы возразить 2anonymous, который раньше возразил мне по поводу "толкания человека на неправильный путь"... :)
Так вот, функция, возвращающая указатель на ей же выделенный буфер совсем не хреновая функция, если следишь за указателями. Вот такой пример:
И никаких проблем. :)
А если дело касается С++, то нужно поменять malloc/free на new/delete и почитать о том, что такое классы, и как с ними работать... :)
Akan
A vot gradi booch rekomenduet ne smotret dazhe na realizaciyu klassa a tolko na interface a dvornik vasya rekomenduet vsem prodat mashiny chtoby emu proshe bylo i t.d. eshe takoe variant mozhno predlozhit :
char * foo() {
static char buf[]="blablabla";
return buf;
}
(kstati tak ne-reentran ctime delaet :) )
2master Проблема возникнет, когда ты попытаешься записать что-нибо в этот буфер (тот, что ты привел в пример), т.к. его выделяет в обласли констант. Хотя, может я и не прав - не знаю, как себя будет вести в этом случае буфер выделенный как STATIC char (естесственно маленькими буквами, я просто хотел подчеркнуть это слово). А для того, чтобы смочь работать с буфером, как с полноценным куском памяти (и читать из него и писать в него) нужен malloc. Кстати, если знатоки захотят кракнуть прогу, скомпиленную в С++, в которой используется new, то они увидят, что этот new в свою очередь вызывает malloc. :)
2Akan :
Problema snimaetsya tak :
vector<char> buf; ,chto po suti i est tip string.
I eshe, esli delo kasaetsya C++ ( kak tyi skazal ), to nikakih
strcopy i char* tam v podavlyaushem bolshinstve slucheav ne nado, dlya
etogo suchestvuut metodyi C++, a ne C.
Ну ну, следи за указателями, только потом не спрашивай malloc debugger получшее где брать. Давить тупой язычок Цэ за эти ублюдочные указатели. И Цэ++ тоже давить.
2последний anonymous: с такими репликами лучше не соваться. Во всяком случае, не инкогнито... Если ручки не оттуда растут да головка не варит - это свои собственные проблемы и совсем не проблемы языка программирования или дебагера...
Если ты не умеешь управлять самолетом, то не кричи, что самолеты плохой вид транспорта, потому что часто падают...
Язык программирования на такие вещи очень даже влияет. Обсуждение этого, правда, обычно перерастает во флейм насчёт использования garbage collector'а. Хотя я сам бы был не против поучаствовать в таком флейме...
Я не думаю, что человек может всегда помнить про все указатели во всех программах, им написанных.
Кстати, есть полно всяких статей, в которых написано, что в программах на Аде ошибок в несколько меньше, чем в программах на С/C++ (конкретные цифры - 4-12), и я ещё не видел статьи, которая бы это оспаривала. Может кто покажет? ;-)
Я не спорю и в курсе Сишных проблем, т.к. постоянно их имею... Просто последний "анонимный товарищ" по-детски как-то наехал, аж читать стыдно было... :)
2Akan:
static char buf[] = "blablabla"; в константы не уйдет, то-же самое касается определения без static.
А вот static char * buf = "blablabla" уйдет в константу, и тогда действительно проблемы при записи возникнут. В мастеровском примере проблема одна - функция будет возвращать один и тот-же указатель при каждом вызове (что, впрочем он и написал ниже своего примера).
А насчет вопроса - IMHO самый правильный ответ привел justme.
Если кто не догадался - я vsl. Просто после очередного запоя я напрочь пароль забыл...
Короче, прежде чем защищать ублюдочные язычки C/C++ - посмотри на любую крупную софтину,
на них писанную. К примеру, на XFree86. Если ты там никогда не ловил лики - твои проблемы.
Кстати, они даже с собой собственный malloc debugger таскают для этой цели - и это ж-ж-ж не
просто так - там не ламеры сидят, знают, что делают. Так что, ламеришко, умерь свой пыл,
и задумайся, так ли хороши указатели, если от них вреда немерянно, а польза весьма сомнительна -
альтернативные решения сплошь и рядом оказываются гораздо более удобными и безопасными.