C: unsigned char * bytes 数组将元素复制到其他 unsigned char * 数组

Posted

技术标签:

【中文标题】C: unsigned char * bytes 数组将元素复制到其他 unsigned char * 数组【英文标题】:C: unsigned char * bytes array copying elements to other unsigned char * array 【发布时间】:2016-09-28 09:57:12 【问题描述】:

我认为复制数组的元素是这样的:

unsigned char *new_bytes_array = malloc(sizeof(unsigned char)*length/2); 
for(int i=0, j=0; i<length; i++) 
  if(i % 2 == 0) continue; 
  new_bytes_array[j] = old_bytes_array[i]; 
  j++;

正在复制但不是通过引用进行值,但我想确保这将是深层复制,而不仅仅是引用或指针的浅层复制。

我知道这可能是简单而荒谬的问题,但我在堆栈上找不到类似的东西,而不是 memcpy() 所有数组,但我只想复制一些元素,例如每隔一个元素,或者复制 1-3 个元素并跳过第 4 个元素,(如果 i%4 == 0 跳过元素)。

【问题讨论】:

您的代码按原样进行“深拷贝”。 请注意,sizeof (unsigned char) 始终为 1,因此编写 1 只是一种烦人的方式(在乘法的情况下是毫无意义的)。考虑删除它。 @unwind 实际上在不同的平台上,sizeof(unsigned char) 并不总是 1。所以我认为删除它不是一个好主意。 @litao3rd 不。你错了,这根本不是真的。 sizeof 的返回值是 char 的单位,所以根据定义 sizeof (char) 是 1。 @unwind 是的,sizeof(char) 在不同的架构上并不总是 1。而sizeof 是在编译时执行的,所以我认为sizeof(unsigned char) 比幻数1 要好。 【参考方案1】:

new_bytes_array[j] 的计算结果为 unsigned char

假设old_bytes_array[i] 也一样,那么这个

new_bytes_array[j] = old_bytes_array[i];

复制unsigned char 而不是指针,而不是unsigned char*

【讨论】:

【参考方案2】:

是的,您显示的分配分配了一个 unsigned char,即在大多数典型计算机上的“一个字节”,它不会复制指针而是原始数据。

这是一个完整的功能,可以满足您的需求,并修复了一些小问题:

void * copy_every_second_byte(const void *src, size_t length)

  if(src == NULL || length == 0)
    return NULL;
  unsigned char *out = malloc(length / 2);
  for(size_t i = 0, j = 0; i < length; ++i)
  
    if(i % 2 == 0) continue;
    out[j++] = ((unsigned char *) src)[i];
  
  return out;

【讨论】:

以上是关于C: unsigned char * bytes 数组将元素复制到其他 unsigned char * 数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C 中将 short 转换为 unsigned char *buf?

有没有合法的方法将 unsigned char 指针转换为 std::byte 指针?

SWIG 将 const unsigned char example[] 包装到 Java byte[] 作为参数

在 C 中读取和写入 unsigned char 的缓冲区到文件?

在 C++ 中将 unsigned char (byte) 数组转换为 unsigned short

C语言 unsigned short 如何相互转 signed char