我有两个字符指针:
char *a="A";
char *b="B";
以及指向指针缓冲区的指针:
char **buf = malloc(sizeof(char*)*2);
我想使用 memcpy 将两个变量复制到 buf:
memcpy(*buf, &a, sizeof(char*));
memcpy(*buf, &b, sizeof(char*));
但它取代了第一个变量..
我怎样才能复制两个?
你真正想做的是什么?
和
char **buf = malloc(sizeof(char*)*2);
memcpy(*buf, &a, sizeof(char*));
memcpy(*buf, &b, sizeof(char*));
除非你在两者之间省略了一些初始化,否则你会得到未定义的行为。malloc
ed 内存的内容是未指定的,因此 when*buf
被解释为void*
in memcpy
,几乎可以肯定不会产生有效指针,并且它是空指针的概率不可忽略。
如果你只想buf
包含两个指针,在malloc
buf[0] = a;
buf[1] = b;
是最简单和最干净的解决方案,但是
memcpy(buf, &a, sizeof a);
memcpy(buf + 1, &b sizeof b);
也将是有效的(也可以使用&buf[1]
而不是buf + 1
.
如果您想连接字符串a
并b
指向,那么您将采用完全错误的方法。您需要char*
指向足够大的区域来保存结果(包括 0 终止符),最简单的方法是使用strcat
.
我用我自己的测试代码尝试了你的程序:我希望这会有所帮助:
#define MAX_LENGTH 10
#define ARRAY_LENGTH 2
int main(int argc, char *argv[])
{
char *a = "A";
char *b = "B";
char **buf = (char **)malloc(sizeof(char*)*ARRAY_LENGTH);
*buf = (char *)malloc(sizeof(char) * MAX_LENGTH);
*(buf+1) = (char *)malloc(sizeof(char) * MAX_LENGTH);
memset(buf[0],0,10);
memset(buf[1],0,10);
memcpy(buf[0],a,strlen(a));
memcpy(buf[1],b,strlen(b));
printf("%s %s",buf[0],buf[1]);
free(buf[0]);
free(buf[1]);
free(buf)
return 0;
}