【问题标题】:Copy two char* to **buff with memcpy - C language使用 memcpy 将两个 char* 复制到 **buff - C 语言
【发布时间】:2012-10-13 11:57:55
【问题描述】:

我有两个 char 指针:

char *a="A";
char *b="B";

还有一个指向指针缓冲区的指针:

char **buf = malloc(sizeof(char*)*2);

我想使用 memcpy 将两个变量复制到 buf:

memcpy(*buf, &a, sizeof(char*));
memcpy(*buf, &b, sizeof(char*));

但它替换了第一个变量..

如何复制两个?

【问题讨论】:

    标签: c memcpy


    【解决方案1】:

    你真正想做的是什么?

    char **buf = malloc(sizeof(char*)*2);
    
    memcpy(*buf, &a, sizeof(char*));
    memcpy(*buf, &b, sizeof(char*));
    

    除非你在两者之间省略了一些初始化,否则你会得到未定义的行为。 malloced 内存的内容是未指定的,因此当 *bufmemcpy 中被解释为 void* 时,几乎可以肯定不会产生有效指针,它是空指针的概率是不可忽略。

    如果你只是想让buf 包含两个指针,在malloc 之后

    buf[0] = a;
    buf[1] = b;
    

    是最简单最干净的解决方案,但是

    memcpy(buf, &a, sizeof a);
    memcpy(buf + 1, &b sizeof b);
    

    也将是有效的(也可以使用&buf[1] 而不是buf + 1

    如果您想连接字符串ab 指向,那么您采用的是完全错误的方法。您需要一个 char* 指向足够大的区域来保存结果(包括 0 终止符),最简单的方法是使用 strcat

    【讨论】:

      【解决方案2】:

      我用我自己的测试代码尝试了你的程序:我希望这会有所帮助:

      #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;
      }
      

      【讨论】:

      • 代码没有缩进,所以一些*被解释为markdown,OP想要复制char *
      • 这是错误代码:char **buf; *buf[0] = malloc(sizeof(char)*MAXLENGTH); *buf[1] = malloc(char)*MAXLENGTH); memcpy(&(*buf[0]),&a, strlen(a)); malloc(&(*buf[1]),&b,strlen(b));
      猜你喜欢
      • 1970-01-01
      • 2020-04-22
      • 2021-08-28
      • 2011-04-05
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 2013-07-09
      • 2018-05-08
      相关资源
      最近更新 更多