В чем проблема?
От: Bleach  
Дата: 27.07.12 10:58
Оценка:
Вот такой вот простенький пример. Может обяснит кто в чем здесь проблема?

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);
Re: В чем проблема?
От: dRew84  
Дата: 27.07.12 11:05
Оценка: 3 (1) +2
Здравствуйте, Bleach, Вы писали:
B>void sss(char **s1,char **s2)
B>{
B> *s2 = (char *)malloc(strlen(*s1));
B> strcpy(*s2,*s1);
B>}

Память выделена под strlen(*s1) без учета завершающего символа. Strcpy копирует все символы, в том числе и завершающий... и копирует его уже куда-то за выделенную память. Типичный buffer overrun.
Re: В чем проблема?
От: VsevolodC Россия  
Дата: 27.07.12 11:05
Оценка: 3 (1)
Здравствуйте, Bleach, Вы писали:

B> *s2 = (char *)malloc(strlen(*s1));


должно быть
*s2 = (char *)malloc(strlen(*s1) + 1);
Re: В чем проблема?
От: rising_edge  
Дата: 27.07.12 11:07
Оценка: 3 (1)
Здравствуйте, Bleach, Вы писали:

B>Вот такой вот простенький пример. Может обяснит кто в чем здесь проблема?


B> *s2 = (char *)malloc(strlen(*s1 + 1));


Выделенное -- это как минимум.
Re: В чем проблема?
От: Bleach  
Дата: 27.07.12 11:08
Оценка:
Спасибо ответившим)
Re: В чем проблема?
От: Сыроежка  
Дата: 27.07.12 11:34
Оценка:
Здравствуйте, 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.

Используйте хорошие примеры!
Меня можно встретить на www.cpp.forum24.ru
Re[2]: В чем проблема?
От: Сыроежка  
Дата: 27.07.12 11:37
Оценка:
Только я сделал опечатку, так как на моем ноутбуке клавиши очень чувствительные. Поэхтому вместо

( chhar * )malloc( strlen( s ) + 1 );

естественно должно быть

( char * )malloc( strlen( s ) + 1 );
Меня можно встретить на www.cpp.forum24.ru
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.