如何使用memcpy复制字符**
我有两个char**变量:如何使用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 ** 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)