LINUX.ORG.RU
потому что указатель *указывает* на некоторую область в памяти. в случае txt2 = txt1, txt2 указывает на тот же адрес, что txt1.
asgard
()
Ответ на: комментарий от hatefu1_dead
ясно , значит "text" остается в памяти пока кто-нибудъ не затерет его ?
anonymous
()
Наверно, я отстал от жизни?
Я раньше считал, что присвоить значение указателю
на строку можно только при инициализации переменной, то есть:
char* txt1="text";

А чтобы присвоить новое значение, надо использовать strcpy:
srtcpy(txt1, "bla-bla-bla");
lonki-lomki
()
Ответ на: комментарий от lonki-lomki
> Я раньше считал, что присвоить значение указателю
> на строку можно только при инициализации переменной, то есть:
> char* txt1="text";

дело в том, что память под "text" "уже выделена" фактически на этапе компиляции. это то же самое, что и

#define STRCONST "mystrconst"

...
char *bla-bla = STRCONST;
...

то же происходит и на этапе инициализации переменных в начале блока.

> А чтобы присвоить новое значение, надо использовать strcpy:
> srtcpy(txt1, "bla-bla-bla");

выделив перед этим достаточное кл-во памяти, на которую будет указывать txt1
asgard
()
Ответ на: комментарий от asgard
> то же происходит и на этапе инициализации переменных в начале блока
Понятно, спасибо за подробное объяснение. Просто, никогда так не
делал, вот и удивился :)

> > А чтобы присвоить новое значение, надо использовать strcpy:
> > srtcpy(txt1, "bla-bla-bla");
>
> выделив перед этим достаточное кл-во памяти,
> на которую будет указывать txt1
Естественно. Сначала надо выделить достаточное количество памяти.

From man strcpy:

If the destination string of a strcpy() is not large enough
(that is, if the programmer was stupid/lazy, and failed to
check the size before copying) then anything might happen.
Overflowing fixed length strings is a favourite cracker technique.
lonki-lomki
()
int a1 = 1;
int a2 = a1;
a1 = 2;

почему a2 == 1 ?

здесь логика абсолютно идентична.
Legioner ★★★★★
()
1) выделилась память на строку "text",
   указатель присвоился txt1
2) txt2 стал _ссылаться_ на "text"
3) выделилась память на строку "bla-bla-bla",
   указатель присвоился txt1, указатель txt2 по прежнему ссылается на "text".

Для копирования строк используй strcpy/strncpy
alex_custov ★★★★★
()
Ответ на: комментарий от lonki-lomki
>Наверно, я отстал от жизни?
>Я раньше считал, что присвоить значение указателю
>на строку можно только при инициализации переменной, то есть:
>char* txt1="text";

>А чтобы присвоить новое значение, надо использовать strcpy:
>srtcpy(txt1, "bla-bla-bla");

Если так сделать, то получишь сегфолт скорее всего (под linux точно,
потому что "text" размещается в памяти только для чтения).
В этом (в размещении) кстати отличие char txt[]="text" от
char* txt="text"

anonymous
()
Ответ на: комментарий от anonymous
Допустим, по адресу ... 0x1000 лежит строка "text" (5 байтов, до адреса 0x1005). По адресу 0x2000 лежит строка "bla-bla-bla (12 байтов, до адреса 0x200С). Указатель txt1 сначала содержит значение 0x1000 (ибо указатель - это всего лишь адрес). Потом указатель txt2 тоже получает значение 0x1000. Потом txt1 меняет значение на 0x2000. При этом txt2 по-прежнему содержит 0x1000.
svu ★★★★★
()
Ответ на: комментарий от asgard
мне тоже захотелось сказать что нибудь умное но передумал :)
before
()
txt1="bla-bla-bla"

Имхо таким образом происходит присваивание адреса, а не значения, кторое лежит по адресу. Может все-таки сначала разыменовать указатель? : *txt1="bla-bla-bla

cathode
()
Ответ на: комментарий от cathode
> *txt1="bla-bla-bla"

Так не бывает. Бывает strcpy

svu ★★★★★
()
Мдя... Похоже, Спольски прав, хотя мне сложно это представить.

http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html

> If I may be so brash, it has been my humble experience that there are two things traditionally taught in universities as a part of a computer science curriculum which many people just never really fully comprehend: pointers and recursion.

watashiwa_daredeska ★★★★
()
а еще есть указатель на указатель
типа:
char* txt1="text";
char** txt2=&txt1;
txt1="bla-bla-bla";

printf ("%s\n", *txt2 );
imp ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.