在 C 中复制无符号字符

Copying unsigned char in C

我想使用 memcpy 但在我看来它是从头开始复制数组?

我想从 A[a] 复制到 A[b]。所以,我找到了另一种方法,

void copy_file(char* from, int offset, int bytes, char* to) {
    int i;
    int j = 0;
    for (i = offset; i <= (offset+bytes); i++) to[i] = from[j++];
}

我遇到了段错误,但我不知道这个段错误是从哪里来的? 每个条目包含 8 个字节,所以我的第二次尝试是

void copy_file(char* from, int offset, int bytes, char* to) {
    int i;
    int j = 0;
    for (i = 8*offset; i <= 8*(offset+bytes); i++) to[i] = from[j++];
}

但还是段错误。如果您需要更多信息,请随时询问!

I'm getting seg faults but I don't know where I am getting this seg fault from?

主要建议:学习使用调试器。它提供有关错误指令的有用信息。


为了回答您对上述问题中显示的代码片段的查询,

  1. 在取消引用之前,根据 NULL 检查传入的指针(tofrom)。
  2. 检查所用索引的边界限制。目前他们可以超出分配的内存。

正确使用memcpy()

根据man pagememcpy()的签名表示

void *memcpy(void *dest, const void *src, size_t n);

它从 src 的地址指针复制 n 字节到 dest 指向的地址。

还有一个非常非常重要的注意事项:

The memory areas must not overlap.

因此,要将 A[a] 复制到 A[b],您可以这样写

memcpy(destbuf, &A[a], (b-a) );

it seems to me that memcpy copying the array from the start

不,不是。事实上,memcpy 根本不知道它是从数组复制还是复制到数组。它将其参数视为指向非结构化内存块的指针。

如果您希望从A[a]复制到A[b],请将A[a]的地址和A[b]A[a]之间的字节数传递给memcpy,像这样:

memcpy(Dest, &A[a], (b-a) * sizeof(A[0]));

这会将 A 的内容从索引 a(包括)复制到索引 b(不包括)到 Dest 指向的内存块中。如果您也希望对 Dest 应用偏移量,请使用 &Dest[d] 作为第一个参数。 sizeof 的乘法对于 char 以外的有符号或无符号类型的数组是必要的。

更改

的最后一行
for (i = offset; i <= (offset+bytes); i++)
to[i] = from[j++];

for (i = offset; i <= bytes; i++,j++)
to[j] = from[i];

这对我来说很好用。我将 offset 视为数组的开头,将 byte 视为数组的结尾。即复制 from[offset]from[bytes]to[].