【问题标题】:How to make a copy of a byte array in c code?如何在c代码中复制字节数组?
【发布时间】:2018-04-05 15:00:45
【问题描述】:

我有字节数组中第一个字符的地址,它的大小: const char *rawImageBytes, int 大小

我想将内容复制到不同的字节数组。然后稍微修改一下。 这就是我现在正在做的事情:

LOGI("FrameReceived will reach here 1");
modifiedRawImageBytes = rawImageBytes;
jint sizeWH = width * height;
jint quarter = sizeWH/4;
jint v0 = sizeWH + quarter;
for (int u = sizeWH, v = v0, o = sizeWH; u < v0; u++, v++, o += 2) {
        modifiedRawImageBytes[o] = rawImageBytes[v]; // For NV21, V first
        modifiedRawImageBytes[o + 1] = rawImageBytes[u]; // For NV21, U second
}

但是我没有得到正确的颜色,就像我会在 Java 中而不是 c++ 中那样。 我假设会发生这种情况,因为我只是做modifiedRawImageBytes = rawImageBytes; 而不是实际复制整个字节数组,以便它可以从另一个地址指针在内存中开始。 有点c初学者,所以我迷路了,有人可以帮我理解做错了什么吗? PS:我假设,因为即使我发送 rawImageBytes 而不是 modifiedRawImageBytes,它仍然会被修改

【问题讨论】:

  • 您将问题标记为 C++,但文本显示您是 C 的初学者。那么它是哪种语言?
  • 好吧,JNI 同时使用了 C 和 C++ ,而且它的代码库都是用这两种语言编写的,所以哪一种都好
  • “所以任何一个都好” - 嗯,但你确实意识到 C 和 C++ 是两种不同的语言,不是吗?当然,您甚至不知道它是用哪种编程语言编写的,就无法处理该代码。

标签: c++ arrays for-loop image-processing size


【解决方案1】:

这是因为const char * 是一个指针。这意味着它代表一个地址。所以你猜对了,新变量代表相同的数据。

为避免这种情况,您应该创建一个副本。

char modifiedRawImageBytes[size];
//if the pointer come from function's param don't redeclare it ;)
std::memcpy(modifiedRawImageBytes, rawImageBytes, size*sizeof(char));

此代码将分配一个新的char 数组,然后memcpy 将在新数组中复制以前的数组数据。

注意需要包含cstdio

【讨论】:

  • sizeof(char) 始终为 1。但为什么不直接使用 std::string modifiedRawImageBytes(rawImageBytes, size)
  • 我用这个:char *modifiedRawImageBytes = malloc(size); memcpy(modifiedRawImageBytes, rawImageBytes, size); 做同样的事情,我不需要包含 cstdio
  • 仍会将其添加为已接受的答案,因为逻辑几乎相同。
  • @rosualin:它根本不做同样的事情。答案中的代码使用具有自动存储持续时间的数组,您的代码使用动态分配。您现在必须手动管理释放,否则会出现内存泄漏。如果你使用 C++ 而不是 C,那么所有这些都是无稽之谈。
  • @ChristianHackl 如果你做的事情非常低级,你可能别无选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
  • 2012-10-05
相关资源
最近更新 更多