Memcpy Char Pointers

0

У меня есть эта простая программа, в которой я хочу конкатенировать два указателя символов, используя memcpy, но я получаю информацию о местоположении нарушения доступа на линии memcpy.

char *first = new char[10], *second=new char[10]; 
first="Hello ";
printf("\second: ");
scanf("%s",&second);
memcpy(first,second,strlen(second)+1);
printf ("Result: %s\n", first);

Поскольку копирование в константу вызывает у меня нарушение, я пробовал это:

char *first = new char[20], *second="world!"; 
printf("first: ");
scanf("%s",&first);
memcpy(first,second,strlen(second)+1);
printf ("Result: %s\n", first);

который получает мне право на доступ к записи. Как я должен правильно совместить два указателя?

  • 3
    первые указывает на постоянную память ..
  • 0
    Почему вы используете scanf и printf в коде C ++?
Теги:
pointers
char
memcpy

3 ответа

2
Лучший ответ
char * concat(const char * first, const char * second)
{
    int lf = strlen(first);
    int ls = strlen(second);
    int len = lf + ls;
    char * rb = new char[len+1];//You need this +1 here
    memcpy(rb, first, lf);
    memcpy(rb+lf, second, ls);
    rb[len] = 0;
    return rb;
}
int main ()
{
    char *first = new char[10], *second=new char[10];
    strcpy(first, "first");//This is an unsafe way. You can take the value from anywhere possible
    strcpy(second, "second");//This is an unsafe way. You can take the value from anywhere possible
    char * third = concat(first, second);
    cout <<  third << endl;//Don't use cout << concat(first, second) << endl; since it leads to a emory leak
    delete [] third;
    return 0;
}

Вы не можете объединить две строки без использования дополнительной памяти, так как каждый раз вам нужен блок памяти размера суммы +1 (или более) двух заданных строк.

8

Ваша memcpy эквивалентна memcpy ("Hello ", second, strlen(second)+1); , Копирование в константу (на некоторых платформах, очевидно, включая ваше) - нарушение прав доступа.

    char *first = new char[10], *second=new char[10]; 
    first="Hello ";

Сначала вы делаете first точку в выделенной памяти. Затем вы удаляете указатель и указываете на статическую строку. Это не то, что вы имеете в виду. Возможно, вы имели в виду:

    strcpy (first, "Hello ");

Это копирует постоянные данные в пространство, на которое first указывает.

3

+ Изменить

scanf("%s", &first);

в

scanf("%s", first);

При сканировании вы получаете неправильную память.

  • 0
    Ага. Функция scanf нуждается в адресе, который вы хотите прочитать, а не в адресе переменной, содержащей этот адрес.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню