Ваш
a="DATA";
удаляет указатель на выделенную память.Он не копирует «ДАННЫЕ» в память.Однако этого будет недостаточно для его хранения, поскольку
a=(char *)calloc(1,(sizeof(char)));
выделяет один символ.В то время как
memcpy(s,a,(strlen(a)));
копирует то, что сейчас указано (строковый литерал "DATA"), в память, на которую указывает s.Но опять же, s
указывает на один выделенный символ, а копирование более 1 символа приведет к перезаписи чего-либо и приведет к ошибке.
strlen(a)
даст вам 4 (длина «DATA») и memcpyкопирует ровно 4 символаНо чтобы узнать, где заканчивается строка, C использует соглашение, чтобы поставить окончательный «нулевой» символ ('\ 0') в его конец.Таким образом, «DATA» в памяти представляет собой «D», «A», «T», «A», «0».
Все функции, связанные со строками, ожидают нулевой байт и не прекращают печать доони находят его.
Чтобы скопировать строки, используйте вместо strcpy
(или strncpy
), он также копирует строку со своим последним нулевым байтом.(strcpy
менее «безопасен», так как вы можете переполнить целевой буфер).
Но самая большая проблема, которую я вижу здесь, состоит в том, что вы резервируете один символ только для (и вы удаляете его тогда) иs, поэтому DATA \ 0 никуда не поместится.