Вот такой вот простенький пример. Может обяснит кто в чем здесь проблема?
void sss(char **s1,char **s2)
{
*s2 = (char *)malloc(strlen(*s1));
strcpy(*s2,*s1);
}
int _tmain(int argc, _TCHAR* argv[])
{
char *s = "Hello";
char *z = NULL;
sss(&s,&z);
printf("%s",z);
free(z);
return 0;
}
ошибка на free(z);
Здравствуйте, Bleach, Вы писали:
B>Вот такой вот простенький пример. Может обяснит кто в чем здесь проблема?
B>void sss(char **s1,char **s2)
B>{
B> *s2 = (char *)malloc(strlen(*s1));
B> strcpy(*s2,*s1);
B>}
B>int _tmain(int argc, _TCHAR* argv[])
B>{
B> char *s = "Hello";
B> char *z = NULL;
B> sss(&s,&z);
B> printf("%s",z);
B> free(z);
B> return 0;
B>}
B>ошибка на free(z);
B>
Ваш код концептуально написан неверно. То есть функция
see, даже не смотря на то, если бы вы правильно выделяли память.
Во-первых, вы передаете указатель на указатель в качестве второго параметра, но внутри функции не освобождаете ту память, на которую может этот указатель указывать. То есть вы уже заложили в свой код мину утечки памяти.
Во-вторых, вы совершенно не меняете в функции первый параметр. Поэтому не понятно, а затем передавать в функцию в качестве первого параметра указатель на указатель, если исходный указатель не будет меняться?
Правильная реализация вашей функции должна выглядеть следующим образом
char * strdup( const char *s )
{
char *p = ( chhar * )malloc( strlen( s ) + 1 );
if ( p ) strcpy( p, s );
return ( p );
}
Кстати сказать, именно так реализована стандартная POSIX функция
strdup.
Используйте хорошие примеры!
Только я сделал опечатку, так как на моем ноутбуке клавиши очень чувствительные. Поэхтому вместо
( chhar * )malloc( strlen( s ) + 1 );
естественно должно быть
( char * )malloc( strlen( s ) + 1 );