В случае, когда p="hello world";
(1-й случай во время этого редактирования), p
инициализируется, чтобы указывать на область памяти только для чтения , которая содержит строку «hello world» (строковый литерал). Эта область памяти только для чтения создается во время компиляции.
В случае, когда возникает ошибка сегментации (2-й случай во время этого редактирования), p
неинициализирован, и копирование чего-либо в него приведет к непредсказуемым результатам, поскольку местоположение в памяти, на которое указывает p
, не является определяется кодом.
Прежде чем вы сможете скопировать строку в p
, вы должны указать память, на которую указывает p
.
Вы можете выделить эту память в стеке
char buf[BUFSIZ] = ""; /* local variable */
в куче
char *buf = malloc(BUFSIZ); /* don't forget to free */
или в сегменте __DATA.
static char buf[BUFSIZ] = ""; /* global variable */
Затем можно инициализировать p
, чтобы он указывал на буфер памяти.
char *p = buf;
В принципе это похоже на инициализацию p
для указания строкового литерала в только для чтения памяти. В отличие от случая, когда p
указывает на строковый литерал, теперь вы можете скопировать строку в символьный указатель, поскольку она не указывает на только для чтения память.
Примечание: Я намеренно создал отдельный буфер и инициализировал p
, чтобы указать на него, чтобы помочь мне понять.