Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Глюки функции strcpy() или что?

17K
21 августа 2006 года
RedHeart
8 / / 21.08.2006
Помогите разобраться в чем трабла я начинающий программист

#include <iostream>

#include <string>

using namespace std;

int main(){

char s1[]="0123456789";

char s2[]="987654321082374583234723542346574234;

strcpy(s1,s2);

cout<<s1<<'\n';

return 0;
}

Выдается ошибка Windows
240
21 августа 2006 года
aks
2.5K / / 14.07.2006
=)))
Все просто. В первой строке выделенно меньше памяти чем во второй. Память выделяется неявно при инициализации строковой переменной. Соответственно при копировании strcpy пытается скопировать больше байт чем влазит в первую строку и выходит за отведенные ей границы.
Может более очевидно будет если переписать код на аналогичный с явным выделением памяти:
Код:
#include <iostream>
#include <string>
using namespace std;

int main(){
char s1[11*sizeof(char)];
strcpy(s1, "0123456789");
char s2[38*sizeof(char)];
strcpy(s2, "987654321082374583234723542346574234");
//как видно объем s2 гораздо больше s1 оттого и ошибка.
strcpy(s1,s2);
cout<<s1<<'\n';
return 0;
}
17K
21 августа 2006 года
RedHeart
8 / / 21.08.2006
А почему тогда "987654321082" нормально копирует?
240
21 августа 2006 года
aks
2.5K / / 14.07.2006
Если в первом примере заменить "987654321082374583234723542346574234" на "987654321082" всеравно не будет копировать нормально. Тоесть сразу может показаться что все хорошо, но она уже залезет в чужую память и ошибки вылезут потом.
В лудшем случае результат такого "копирования" просто останется незаметен. В худшем что то сломается в самом неподходящем месте. Так что сразу надо отучаться от такого.
17K
21 августа 2006 года
RedHeart
8 / / 21.08.2006
Так а можно свою написать так что бы проблем не было?
Да и можно изменить размер строки (куда копируется)? Если да то как?
240
21 августа 2006 года
aks
2.5K / / 14.07.2006
[QUOTE=RedHeart]Так а можно свою написать так что бы проблем не было?
[/QUOTE]
Свою что? Аналог strcpy? Так а зачем изобретать велосипед? Если правильно подходить к указателям и границам массивов то и проблем не будет, а если неправильно то и в самописной функции можно нарваться на такую же ошибку.
К тому же раз исспользуешь классы стандартной C++ библиотеки и боишся ошибок в Сишных функциях, почему бы не исспользовать тот же std::string вместо char *
[QUOTE=RedHeart]
Да и можно изменить размер строки (куда копируется)? Если да то как?[/QUOTE]
Для статически заданной нет нельзя.
Если динамически - сколько угодно.
 
Код:
char *s1 = new char[10];
delete []s1;
s1 = new char[100];
1.9K
21 августа 2006 года
[*]Frosty
278 / / 17.06.2006
При вызове ф.
 
Код:
strcpy(char* des, char* src)
в строке des(приемнике) должно быть выделено достаточно памяти для размещения в ней(нем) строки scr(источника) вместе с терминирующим нулем.
ф. C:
void * maloc(size_t size) - выделение памяти
 
Код:
//Example:
char * str = (char *)malloc(N*sizeof(char));// выделение памяти, необходимых для размещения N величин типа char

 
Код:
void * realoc(void *ptr, size_t size)
- перераспределение
ptr - указатель на участок памяти
size - новый объем
Старое содержание строки "остаеться на месте".
см. http://forum.codenet.ru/showthread.php?t=28288 5 сообщение
Удаление с помощью free();
Если С++ решишь использовать - string и ты свободен. Читай хелп, по нему и спрашивай если не понятно.
17K
21 августа 2006 года
RedHeart
8 / / 21.08.2006
Спасибо что разъяснили Новичку ситуацию со стороками
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог