как я могу безопасно использовать strcpy

Я хочу назначить 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
...

2

Решение

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 является то, что указатель назначения должен указывать на область памяти с достаточным пространством для строки, на которую указывает указатель источника. Вероятно, ваши «проблемы с памятью во время выполнения» были связаны с тем, что вы этого не гарантировали, поэтому вам нужно прочитать книгу.

4

Другие решения

Краткий ответ: вы не должны использовать strcpy на всех, а скорее strncpy, Последняя функция делает не полагаться на отставание \0 и требует от вас предоставить максимальную длину для копирования.

Кроме того, для назначения указателя вам не обязательно strncpy совсем. хотите ли вы копия память или просто переназначить указатели? Для переназначения = Оператор в порядке.

3

char* это указатель на символ вашей строки. Чтобы сделать копию, вам нужно сначала выделить для нее память и запустить копию. Что-то вроде

size_t l = strlen(src);
char *dst = malloc(l+1);
memmove(dst,src,l+1);

(и сделайте некоторую проверку ошибок, если malloc преуспел, и т. д.).

Хотя, учитывая ваш вопрос помечен c++Я бы порекомендовал вам использовать std::string класс и почитать. Это действительно помогает понять, как все работает на самом деле.

2

Вы должны убедиться, что приемный буфер достаточно велик, чтобы соответствовать исходной строке, включая завершающий '\0'-характер в конце. Это действительно так.

Если вы можете представить строки как просто char * указатели, которые вы можете скопировать, тогда это здорово, но это не всегда возможно.

1
По вопросам рекламы [email protected]