Вы должны понимать, что если у вас есть строка как cp = "2"
, то
- Компилятор создает строковый литерал как
"2"
. - Этот строковый литерал обычно хранится в ячейке памяти, доступной только для чтения.
- Адрес строкового литерала хранится в указателе
cp
Теперь, если вы используете динамическое выделение памяти c как
char *first = alloc(6);
first = "First";
Что происходит в первом операторе, так это то, что память выделяется из буфера * stati c allocbuf
, а адрес выделенной памяти сохраняется в first
. Со вторым оператором вы перезаписываете указатель first
местоположением в постоянной памяти. Таким образом, вы теряете ранее выделенный указатель, и у вас утечка памяти
Если вы используете alloc
, вы должны скопировать данные First
в память с помощью strcpy
strcpy(first, "First")
Если я назначу first = allo c (1), а затем назначу first = "First", это сработает и перезапишет содержимое allocbuf, верно?
Нет, вы не перезаписываете содержимое allocbuf
, но используете новый указатель для чтения только памяти.
Почему строка printf ("allocbuf:% s \ n", allocbuf) ; не распечатывать содержимое allocbuf в моем коде?
Я отвечу на это в контексте опубликованного кода.
occupyalloc = alloc(4); //returns allocp 0, intended storage space is allocbuf[0] through allocbuf[3]
cp = alloc(3); //returns allocp 4, intended use is allocbuf[4] through allocbuf[6]
strcpy2(cp, copy); //copies "4444" into *cp, specifically allocbuf[4] through allocbuf[7]
printf ("cp:% s \ n", cp); // "4444", хранится в allocbuf [4] через allocbuf [7] неправильно printf ("allocbuf:% s \ n", allocbuf); // печатает allocbuf - не работает
В этом случае allocbuf[0]
будет \0
, так как вы не изменяете occupyalloc
переменную.
Обратите внимание, что "4444"
требует 5 байтов, и вы назначаете только 3 байта.