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 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.