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

Ваш аккаунт

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

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

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

Помогите разобраться со строками!

33K
17 августа 2009 года
Posix86749
54 / / 13.07.2009
есть код:
Код:
char *temp1,*temp2, *temp1_first, *temp2_first;//1
temp1=new char[5];//2
temp2=new char[5];//3
temp1_first=temp1;//4
temp2_first=temp2;//5
temp1=(ADOQuery1->FieldByName("Connect_Time")->AsString).c_str();//6
int i=0;//7
while(temp1!='.')//8
   {
      temp2=temp1;        //9
      i++;//10
   }
.
.
.
temp1=temp1_first;//11
temp2=temp2_first;//12
delete [] temp1;//13
delete [] temp2;//14
temp1_first=NULL;//15
temp2_first=NULL;//16


Код выполняется неправильно. Стал разбираться в чем проблема, отслеживал пошагво
в результате получается так:
после выполнения строчки (2), temp1="" (вроде так и должно быть);
после выполнения(3) temp2="eve_byte" (откуда этот текст взялся??!!)
после выполнения (6) temp2="eve_byte\x1E" (а откуда взялись эти символы \x1E ?)
ну а дальше у же не так интересно, дальше эти непонятные символы все портят...

Пожалуйста, подскажите чего не так?
297
17 августа 2009 года
koodeer
1.2K / / 02.05.2009
Цитата:
temp2=new char[5];//3


В этой строке оператор new выделяет память, но он ничем её не заполняет! В выделенном участке памяти может находиться что угодно.

Цитата:
после выполнения(3) temp2="eve_byte" (откуда этот текст взялся??!!)


Ничего удивительного - это мусор. Каждый раз может быть любое значение.

11
17 августа 2009 года
oxotnik333
2.9K / / 03.08.2007
Хелп внимательно читаем (особенно примеры)
[quote=BCB Help]
AnsiString::c_str() returns a non const temporary pointer to the internal string buffer in the AnsiString object. The pointer is invalid once the statement in which it is used has finished executing. That is,don't do something like this:

char* cp = Edit1->Text.c_str();
char* cp2 = strtok( cp, " \t\n" ); // cp may no longer be valid


If you need a persistent pointer, you MUST copy the string into its own buffer:

char* cp = new char[ Edit1->Text.Length() + 1 ];
strcpy( cp, Edit1->Text.c_str() );
[/quote]
33K
18 августа 2009 года
Posix86749
54 / / 13.07.2009
Цитата: koodeer

Ничего удивительного - это мусор. Каждый раз может быть любое значение.



мусор? а почему этот мусор имеет такой осмысленный вид и каждый раз этот мусор у меня один и тот же?
А почему в первой переменной temp1 этого мусора нету? и никогда не бывает?

33K
18 августа 2009 года
Posix86749
54 / / 13.07.2009
Цитата: oxotnik333
Хелп внимательно читаем (особенно примеры)


Т.е. согласно этого хелпа конструкция

 
Код:
temp1=(ADOQuery1->FieldByName("Connect_Time")->AsString).c_str();

будет заведомо неправильной?
Но ведь я же проверял, при пошаговом выполнении temp1 принимает то значение кторое и должно быть. Что-то я не догоняю... :confused:
14K
18 августа 2009 года
viva
27 / / 07.04.2006
 
Код:
temp1=new char[5];  memset(temp1,0,5); //2
temp2=new char[5];  memset(temp2,0,5); //3
temp1_first=temp1;//4
temp2_first=temp2;//5
memcpy(temp1,(ADOQuery1->FieldByName("Connect_Time")->AsString).c_str(),5);//6
33K
18 августа 2009 года
Posix86749
54 / / 13.07.2009
Цитата: viva
 
Код:
temp1=new char[5];  memset(temp1,0,5); //2
temp2=new char[5];  memset(temp2,0,5); //3
temp1_first=temp1;//4
temp2_first=temp2;//5
memcpy(temp1,(ADOQuery1->FieldByName("Connect_Time")->AsString).c_str(),5);//6



а так обязательно делать? а если просто вместо memcpy использовать StrLCopy и без memset'ов?

297
18 августа 2009 года
koodeer
1.2K / / 02.05.2009
Цитата: Posix86749
почему этот мусор имеет такой осмысленный вид


Случайность, чистая случайность. Может быть любой набор символов.

Цитата: Posix86749
и каждый раз этот мусор у меня один и тот же?


Потому что каждый раз Винда выделяет одно и то же место в памяти. Если позапускать разные приложения на компе, то распреледение памяти может измениться, и мусор окажется другим.

Цитата: Posix86749
А почему в первой переменной temp1 этого мусора нету? и никогда не бывает?


Там тоже мусор, просто на первой же позиции, очевидно, оказывается символ с кодом '\0'. Опять же, если запустить ещё приложения, то распределение памяти изменится, и этот указатель может начать указывать совсем на другой символ, что отобразится в отладчике как мусор.

Цитата:
а если просто вместо memcpy использовать StrLCopy


Можно использовать strcpy.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог