char* и память
От: TNikolay Россия http://softvoile.com/
Дата: 22.09.07 20:08
Оценка:
Доброго времени суток,

Обьясните мне пожалуйста про работу с памятью, а то пора бы знать уже а я все никак
если мы делаем
   char * pc;
  pc="test";


Я так понимаю компилятор выделяет память для "test" и pс сылается на это адрес. Все ок, и разницы обьявлен pc как const char * или char*, нету.

А что происходит когда делаем :
  const char * pc;
    string str;
    pc=str.c_str()

pc валиден только пока str не вышла из области видимости или нет? и если мы str="d"; сделаем то все, pc уже "не тот"?

Правильно ли я все понимаю, а то что-то засомневался

И еще в STL Format для стринг как я понял нету, я делаю так

    stringstream str;
  str<<"Cell["<< col <<","<< row  <<"]";            
    PrintDebug(Screen, str.str(), 5, 25); 
    str.str("");
  str<<"State = "<< field[col][row].state <<" , value = "<< field[col][row].value;  
    PrintDebug(Screen, str.str(), 5, 40);
    str.str("");
    ...

Это более менее нормально или есть более правильный путь?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Блог шароварщика ::Микроблог про wxWidgets
Re: char* и память
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 22.09.07 20:21
Оценка:
Здравствуйте, TNikolay, Вы писали:

TN> pc валиден только пока str не вышла из области видимости или нет? и если мы str="d"; сделаем то все, pc уже "не тот"?

В принципе указатель, возвращенный c_str, действителен пока не вызвана неконстантная функция. Соответственно operator= совсем не константная функция.

TN>Это более менее нормально или есть более правильный путь?

Нормально. Хотя красивее было бы писать что-то типа Screen<<"State = "<< field[col][row].state <<" , value = "<< field[col][row].value;
Re: char* и память
От: dip_2000 Россия  
Дата: 24.09.07 04:35
Оценка:
Здравствуйте, TNikolay, Вы писали:

TN>Доброго времени суток,

И вам

TN> И еще в STL Format для стринг как я понял нету, я делаю так


TN>
TN>    stringstream str;
TN>  str<<"Cell["<< col <<","<< row  <<"]";            
TN>    PrintDebug(Screen, str.str(), 5, 25); 
TN>    str.str("");
TN>  str<<"State = "<< field[col][row].state <<" , value = "<< field[col][row].value;  
TN>    PrintDebug(Screen, str.str(), 5, 40);
TN>    str.str("");
TN>    ...
TN>

TN>Это более менее нормально или есть более правильный путь?
http://www.boost.org/libs/format/doc/format.html
Re: char* и память
От: Smal Россия  
Дата: 24.09.07 06:26
Оценка:
Здравствуйте, TNikolay, Вы писали:

TN>Доброго времени суток,


TN> Обьясните мне пожалуйста про работу с памятью, а то пора бы знать уже а я все никак

TN> если мы делаем
TN>
TN>   char * pc;
TN>  pc="test";
TN>


TN> Я так понимаю компилятор выделяет память для "test" и pс сылается на это адрес. Все ок, и разницы обьявлен pc как const char * или char*, нету.


В данном случае выделение памяти не происходит, т.к. "test" — строковый литерал, который уже хранится в программе, а pc просто на него указывает.
Вариант
char * pc = "test";

хоть и работает (для совместимости с С, кажется), но неверен по смыслу.
Ибо
char * pc = "test";
pc[0] = 'T'; // UB
С уважением, Александр
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.