Переназначение указателя от &"hello"[0]
до &"world"[0]
явно изменит его значение. (&[0]
просто делает явно неявное затухание массива явным).
Строковые литералы сохраняются в статической памяти только для чтения (= они имеют время жизни программы), а "hello"
и "world"
совершенно определенно не могут занимать одно и то же место, учитывая их различное содержимое.
Изменение указателя с "hello"
на "hello\0world"
может оставить значение указателя без изменений, поскольку тогда компилятор может объединить два строковых литерала в один ( 6.4.5p7 ).
Но нетиз моих установленных компиляторов (tcc, gcc, clang) это делает.
Для
#include <stdio.h>
int main()
{
char *p;
p = "hello";
printf("%p\n", p);
p = "hello\0world";
printf("%p\n", p);
p = "world";
printf("%p\n", p);
}
Я получаю различные значения указателя, например:
0x55c30f718004
0x55c30f718014
0x55c30f71800e