Memcpy字符指针

Memcpy Char Pointers

本文关键字:指针 字符 Memcpy      更新时间:2023-10-16

我有一个简单的程序,我想在其中使用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: %sn", first);

因为复制到常量中会导致违规,所以我尝试了以下操作:

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

这让我可以访问违规写入位置。我应该如何正确连接两个指针?

您的memcpy相当于memcpy ("Hello ", second, strlen(second)+1);。复制到常量中(在某些平台上,显然包括您的平台(是一种访问违规。

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

首先,使first指向您分配的某个内存。然后你把指针扔掉,让它指向一个静态字符串。你不是这个意思。也许你的意思是:

    strcpy (first, "Hello ");

这将常量的数据复制到first指向的空间中。

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(或更多(的内存块。

更改

scanf("%s", &first);

scanf("%s", first);

扫描时访问错误的内存。