Помогите разобраться со строками!
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 ?)
ну а дальше у же не так интересно, дальше эти непонятные символы все портят...
Пожалуйста, подскажите чего не так?
В этой строке оператор new выделяет память, но он ничем её не заполняет! В выделенном участке памяти может находиться что угодно.
Ничего удивительного - это мусор. Каждый раз может быть любое значение.
[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]
Ничего удивительного - это мусор. Каждый раз может быть любое значение.
мусор? а почему этот мусор имеет такой осмысленный вид и каждый раз этот мусор у меня один и тот же?
А почему в первой переменной temp1 этого мусора нету? и никогда не бывает?
Т.е. согласно этого хелпа конструкция
будет заведомо неправильной?
Но ведь я же проверял, при пошаговом выполнении temp1 принимает то значение кторое и должно быть. Что-то я не догоняю... :confused:
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
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'ов?
Случайность, чистая случайность. Может быть любой набор символов.
Потому что каждый раз Винда выделяет одно и то же место в памяти. Если позапускать разные приложения на компе, то распреледение памяти может измениться, и мусор окажется другим.
Там тоже мусор, просто на первой же позиции, очевидно, оказывается символ с кодом '\0'. Опять же, если запустить ещё приложения, то распределение памяти изменится, и этот указатель может начать указывать совсем на другой символ, что отобразится в отладчике как мусор.
Можно использовать strcpy.