В C строковые литералы, такие как "123"
, хранятся как массивы char
(const char
в C ++). Эти массивы хранятся в памяти так, что они доступны в течение всего срока действия программы. Попытка изменить содержимое строкового литерала приводит к неопределенному поведению; иногда это будет «работать», иногда - нет, в зависимости от компилятора и платформы, поэтому лучше рассматривать строковые литералы как неписываемые.
Помните, что в большинстве случаев выражение типа "массив N-элементов из T
" будет преобразовано в выражение типа "указатель на T
", значением которого является местоположение первого элемента в массиве. ,
Таким образом, когда вы пишете
char *src = "123";
char *des = "abc";
выражения "123"
и "abc"
преобразуются из "3-элементного массива char
" в "указатель на char
", а src
будет указывать на '1'
в "123"
, а des
будет указывать на 'a'
в "abc"
.
Опять же, попытка изменить содержимое строкового литерала приводит к неопределенному поведению, поэтому когда вы пишете
des[0] = src[0];
компилятор может обрабатывать это утверждение любым способом, от которого он хочет: от полного его игнорирования до выполнения именно того, что вы ожидаете, от всего, что находится между ними. Это означает, что строковые литералы или указатель на них не могут использоваться в качестве целевых параметров для вызовов, таких как strcpy
, strcat
, memcpy
и т. Д., А также не должны использоваться в качестве параметров для вызовов, таких как strtok
.