【问题标题】:Copy from 2d dynamic char array to another 2d dynamic array in c在c中从二维动态字符数组复制到另一个二维动态数组
【发布时间】:2018-05-17 16:05:49
【问题描述】:

我想将一个二维数组的内容复制到另一个二维 char 数组中。我将以下for 循环与memcpy 一起使用,但它没有按预期工作。所以我有两个问题。

  1. 这段代码有什么问题?和
  2. 有没有不使用迭代的方法?

    for (int i = 0; i < count; i++) {
        memcpy(&buf_copy[i], buf[i], sizeof(buf[i]));
    }
    

bufbuf_copy 都是二维动态字符数组。

编辑:数组的声明

char **buf;
char **buf_copy;

编辑 2:这是分配给它们的内存的方式

void intit_buf()
{
    buf = (char**)malloc(BUFFER * sizeof(*buf));
    for (int i = 0; i < BUFFER; i++)
        buf[i] = (char*)malloc(sizeof(char) * 33);

    //initialize buf_copy
    buf_copy = (char**)malloc(BUFFER * sizeof(*buf_copy));
    for (int i = 0; i < BUFFER; i++)
        buf_copy[i] = (char*)malloc(sizeof(char) * 33);
}

【问题讨论】:

  • “buf 和 buf_copy 都是二维动态字符数组” - 我强烈怀疑它们不是。指针业务正在进行,而你失败了,因为你不明白 sizeof 在这种情况下会做什么。
  • 当你说“二维动态字符数组”时,你的意思是char **?然后你有多个问题。请创建Minimal, Complete, and Verifiable Example 向我们展示。
  • 请发一个完整的例子!
  • 你是如何为你的数组分配内存的?
  • @John_D 也显示为该代码。请发布一个最小示例完整示例。

标签: c pointers multidimensional-array dynamic-arrays memcpy


【解决方案1】:

这段代码有什么问题?

函数调用的第一个和最后一个参数。

改变这个:

memcpy(&buf_copy[i], buf[i], sizeof(buf[i]));

到这里:

memcpy(buf_copy[i], buf[i], 33);

因为你需要给出列的大小,而不是指针的大小!

此外,请注意您需要传递buf_copy,就像您为buf 所做的那样,而不是获取它的地址或其他东西,因为memcpy() 需要指针用于它的两个第一个参数,而buf_copy[i]buf[i] 已经是指针了。

有没有不使用迭代的方法?

没有 ireation 就无法完成,因为malloc() 可能没有返回了连续内存。阅读更多C / C++ How to copy a multidimensional char array without nested loops?


PS:与您的问题无关,但总的来说:Do I cast the result of malloc? 没有!

【讨论】:

  • 你觉得我的第二个问题怎么样?
  • 现在我可以接受你的回答了。早些时候,我不希望我的问题很快被标记为“已回答”,因为我正在等待关于我的第二个问题的答复。并且数组的维度在编译时是已知的。感谢您的链接
  • 更一般地说,一旦我们谈到动态分配的行的指针数组,没有迭代就无法完成。 char a[10][20] 是一个连续的内存块,char b[n][m] 也是如此。但是char **cc=malloc(n*sizeof(char *)) 不会产生连续内存的二维数组。
  • 好的,@PaulOgilvie 感谢您帮助我改进答案!
猜你喜欢
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 2021-12-31
  • 2014-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多