Я хочу назначить char*
в char*
если я использую strcpy
Я получаю несколько проблем с памятью во время выполнения, поэтому я исправляю это простым = operator
,
Может кто-нибудь объяснить, что следует подготовить перед использованием strcpy
чтобы избежать проблем с памятью.
РЕДАКТИРОВАТЬ:
int Function(const char* K,char* FileIN,char* FileOut,int DC)
{
char *fic_in,*n_fic,*fic_out,*fic_dec;
unsigned char k[17];
fic_in = (char*)malloc(60*sizeof(char));
strcpy((char*)k,K);
//strcpy(fic_in,FileIN); //I remove this one
fic_in=FileIN; //and replace it by this
...
const char *a = "string literal";
const char *b;
a
это указатель, который указывает на строковый литерал. b
это указатель, который нигде не указывает конкретно (он неинициализирован).
b = a;
b
теперь указывает на ту же память, что a
указывает на.
char c[100];
c
сейчас массив из 100 символов. Эта область памяти полностью отделена от всего остального.
strcpy(c, a);
Содержание c
(точнее, первые 15 байтов) теперь содержат те же значения, что и память, на которую указывает a
, Так что теперь есть два области памяти, которые содержат одинаковые строковые данные.
Итак, как вы можете видеть, назначение указателей не имеет ничего общего с strcpy
, Если вы хотите назначить char*
к char*
тогда ты не должен быть где-то рядом strcpy
,
Важно, чтобы вы прочитали книгу о C ++, но основное требование для strcpy
является то, что указатель назначения должен указывать на область памяти с достаточным пространством для строки, на которую указывает указатель источника. Вероятно, ваши «проблемы с памятью во время выполнения» были связаны с тем, что вы этого не гарантировали, поэтому вам нужно прочитать книгу.
Краткий ответ: вы не должны использовать strcpy
на всех, а скорее strncpy
, Последняя функция делает не полагаться на отставание \0
и требует от вас предоставить максимальную длину для копирования.
Кроме того, для назначения указателя вам не обязательно strncpy
совсем. хотите ли вы копия память или просто переназначить указатели? Для переназначения =
Оператор в порядке.
char*
это указатель на символ вашей строки. Чтобы сделать копию, вам нужно сначала выделить для нее память и запустить копию. Что-то вроде
size_t l = strlen(src);
char *dst = malloc(l+1);
memmove(dst,src,l+1);
(и сделайте некоторую проверку ошибок, если malloc преуспел, и т. д.).
Хотя, учитывая ваш вопрос помечен c++
Я бы порекомендовал вам использовать std::string
класс и почитать. Это действительно помогает понять, как все работает на самом деле.
Вы должны убедиться, что приемный буфер достаточно велик, чтобы соответствовать исходной строке, включая завершающий '\0'
-характер в конце. Это действительно так.
Если вы можете представить строки как просто char *
указатели, которые вы можете скопировать, тогда это здорово, но это не всегда возможно.