Стандартная ошибка начинающего (и не только) программиста - переполнение буфера при копировании строк. Вот не совсем корректный код:
Код:
#define SZSIZE 100 Код:
char sz[SZSIZE*100]; Код:
char sz[SZSIZE]; Такой: Код:
char sz[SZSIZE]; Код:
char sz[SZSIZE + 1]; Код:
char sz[SZSIZE]; Добавлено: О, забыл. Код:
char sz[SZSIZE]; |
Извращаться - так красиво.
Код:
int len; |
перефразируем :)
Код:
#define strNcpy(dest,src,maxsize) \ |
ivank
Фишка в том, что использование динамической памяти накладывает на программиста обязательство следить за использованными ресурсами. Убирать за собой мусор - тоже своего рода искусство. Но если предположить, что всё будет почищено , то ещё вариант: Код:
char *psz; |
hasherfrog
Так alloca - не динамисечкая память, в этом вся фишка :) Она на стеке память выделяет. Правда, может возникнуть stack overflow. |
ivank
Да, я лоханулся, alloca а не alloc. Не заметил во-первых, а во-вторых, я никогда ей не пользуюсь из-за man alloca: Цитата:
|
Ну... Я на самом деле тоже, поскольку пользую C++, а там и (относительно) умные указатели сделать несложно.
Я, кстати, не знаю ни одной юниксообразной операционка , где этой ф-ии не было бы. В Windows оно тоже есть, только alloca_ зовётся. Так что, имхо, из-за непереносимости её не пользовать довольно таки странно. P.S. В C99 есть массивы перменного размера. Точнее, не совсем переменного. Поскольку, по сути это та же alloca, но присутствующая в стандарте. |
Цитата:
Но в общем случае, в принципе, в С можно юзать. Жаль, что strdupa в RTL у м$ нет. Это был бы идеальный вариант. :) |
Ну вот, сам же и словил багу.
Код:
char sz[SZSIZE]; |
Время: 02:10. |
Время: 02:10.
© OSzone.net 2001-