如何在C语言中复制字节数组?附现有实现代码疑问
问题分析与解决方案
首先得指出你当前代码里的关键问题:你直接写 modifiedRawImageBytes = rawImageBytes; 这只是让新指针指向了原数组的内存地址,并没有真正复制字节数组的内容。这样后续修改 modifiedRawImageBytes 的时候,实际上是在修改原数组 rawImageBytes 的数据,完全不符合你“复制到新数组再修改”的需求。
正确的实现步骤
- 第一步:为新数组分配足够的内存空间,大小和原数组一致(也就是传入的
size) - 第二步:将原数组的内容完整复制到新数组中
- 第三步:对新数组进行你需要的修改操作
修正后的代码示例
假设你用的是C/C++环境,这里给出完整的可运行实现:
LOGI("FrameReceived will reach here 1"); // 1. 为新数组分配内存,务必检查分配是否成功 char* modifiedRawImageBytes = (char*)malloc(size); if (modifiedRawImageBytes == NULL) { LOGI("Failed to allocate memory for modified image bytes"); // 这里可添加错误处理逻辑,比如直接返回或终止操作 return; } // 2. 把原数组的内容完整复制到新数组 memcpy(modifiedRawImageBytes, rawImageBytes, size); // 3. 执行你的修改逻辑(补全你之前的代码逻辑) 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[u]; modifiedRawImageBytes[o + 1] = rawImageBytes[v]; } // 重要提醒:使用完新数组后,记得在合适的时机释放内存,避免泄漏 // free(modifiedRawImageBytes);
补充说明
- 如果是C++环境,你也可以用
new[]分配内存:char* modifiedRawImageBytes = new char[size];,释放时对应使用delete[] modifiedRawImageBytes; - 内存分配的检查不能省略,否则遇到内存不足时会触发空指针异常
- 内存释放要和分配操作严格对应,长期运行的程序尤其要注意避免内存泄漏
内容的提问来源于stack exchange,提问作者rosu alin
相关产品推荐
相关产品推荐

