如何使用memcpy复制字符**

如何使用memcpy复制字符**,c,C,我有两个char**变量: char ** a; char ** b; 由于a包含一组字符数组,b也包含一组字符数组,在重新分配a的内存后,我想用b字符数组将其追加,如下所示: memcpy(a + oldSizeOfA, b, sizeOfB); 我希望b中的所有字符数组都在a中,我做错了什么 我试图将代码简化为: char ** a = (char **)malloc(5*sizeof(char*)); char ** b = (char **)malloc(10*sizeof(char

我有两个char**变量:

char ** a;
char ** b;
由于
a
包含一组字符数组,
b
也包含一组字符数组,在重新分配
a
的内存后,我想用b字符数组将其追加,如下所示:

memcpy(a + oldSizeOfA, b, sizeOfB);
我希望
b
中的所有字符数组都在
a
中,我做错了什么

我试图将代码简化为:

char ** a = (char **)malloc(5*sizeof(char*));
char ** b = (char **)malloc(10*sizeof(char*));

for (i = 0; i < 5; i++) 
{
    b[i] = (char *)malloc(4);
    strcpy(b,"tes");

    a[i] = (char *)malloc(4);
    strcpy(a,"tes");
}

memcpy(&a + 5, &b, 5);
char**a=(char**)malloc(5*sizeof(char*);
char**b=(char**)malloc(10*sizeof(char*);
对于(i=0;i<5;i++)
{
b[i]=(char*)malloc(4);
strcpy(b,“tes”);
a[i]=(char*)malloc(4);
strcpy(a,“tes”);
}
memcpy(a+5和b+5);

如果要将数组b中的五个元素复制到数组a中从索引5开始的五个位置,则不需要:

memcpy(&a+5,&b,5)

应该是

memcpy(a + 5, b, 5 * sizeof(*b)); // See Note below
这与
a
b
指向的类型无关

但是请注意,如果
a
b
指向指针,则只复制指针。因此,如果
a
b
是字符串数组--
char**
,那么
a[5]
b[0]
是同一个指针。这可能很好,但也可能是个问题。例如,如果修改
b[0]
中的某些字符,则指向
a[5]
的字符串(即相同的字符串)也将更改。关键的是,如果您
free(b[0])
,则
a[5]
不再是有效的指针,因此您无法引用它或
free

不复制字符串可以节省大量内存,但内存共享在簿记方面付出了巨大的代价。创建新字符串通常更简单,这意味着您需要使用类似于
strdup
(或者您可以写出
malloc
strcpy
,但是
strdup
不太容易出现错误)


a
b
是带有地址的变量<代码>&a
&b
是变量的地址。由于
a
是一个标量变量,
&a+5
是未定义的行为。它指向函数局部堆栈帧中的其他位置(如果堆栈帧足够大),这意味着指向其他局部变量。但是你不知道是哪一个变量,你也无权这样描述它,即使你知道它是哪一个

您感兴趣的是数组
a
中指向的第六个插槽的地址,即
a+5
(感谢C指针算法)或
&a[5]
,许多人会说这更清楚


另外,与
malloc
类似,
memcpy
以字节为单位计数,而不是以元素为单位(因为它不知道元素大小)。因此,计数5意味着“5字节”,你会发现这比5个指针要少得多。(实际上,它可能小于一个指针。)

如果要将数组b中的五个元素复制到数组a中从索引5开始的五个位置,则不需要:

memcpy(&a+5,&b,5)

应该是

memcpy(a + 5, b, 5 * sizeof(*b)); // See Note below
这与
a
b
指向的类型无关

但是请注意,如果
a
b
指向指针,则只复制指针。因此,如果
a
b
是字符串数组--
char**
,那么
a[5]
b[0]
是同一个指针。这可能很好,但也可能是个问题。例如,如果修改
b[0]
中的某些字符,则指向
a[5]
的字符串(即相同的字符串)也将更改。关键的是,如果您
free(b[0])
,则
a[5]
不再是有效的指针,因此您无法引用它或
free

不复制字符串可以节省大量内存,但内存共享在簿记方面付出了巨大的代价。创建新字符串通常更简单,这意味着您需要使用类似于
strdup
(或者您可以写出
malloc
strcpy
,但是
strdup
不太容易出现错误)


a
b
是带有地址的变量<代码>&a
&b
是变量的地址。由于
a
是一个标量变量,
&a+5
是未定义的行为。它指向函数局部堆栈帧中的其他位置(如果堆栈帧足够大),这意味着指向其他局部变量。但是你不知道是哪一个变量,你也无权这样描述它,即使你知道它是哪一个

您感兴趣的是数组
a
中指向的第六个插槽的地址,即
a+5
(感谢C指针算法)或
&a[5]
,许多人会说这更清楚


另外,与
malloc
类似,
memcpy
以字节为单位计数,而不是以元素为单位(因为它不知道元素大小)。因此,计数5意味着“5字节”,你会发现这比5个指针要少得多。(事实上,它可能少于一个指针。)

memcpy只能将一个相邻块复制到另一个块。这在这里可能适用,也可能不适用。这取决于首先如何分配字符数组以及字符数组的数组。问:我想你知道a和b中的#/字符数组吧?以及*a和*b中每个字符数组的长度?您没有提供足够的信息。您需要显示更多的代码,可能是a。我不确定,但我认为
a
b
需要是2D数组,而不仅仅是指向指针的指针。如果你有两个2D数组,那么检查这个问题好吧,我的错,我刚刚用一个例子更新了我的帖子。你应该总是根据f来写分配(用C)