在C中复制unsigned char

时间:2015-04-07 09:47:53

标签: c arrays pointers segmentation-fault memcpy

我想使用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++];
}

我遇到了seg故障,但我不知道从哪里得到这个seg故障? 每个条目都有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++];
}

但仍然是错误的。如果您需要更多信息,请不要犹豫!

3 个答案:

答案 0 :(得分:1)

  

我遇到了seg故障,但我不知道从哪里得到这个seg故障?

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


要回答您对上述问题所示代码段的查询,

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

  3. 正确使用memcpy()

    根据man pagememcpy()的签名表示

      

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

    它将n字节从地址指针复制srcdest指向的地址。

    另外,非常重要的一点需要注意:

      

    内存区域不得重叠。

    因此,要将A [a]复制到A [b],您可以编写类似

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

答案 1 :(得分:1)

  

在我看来,memcpy从头开始复制数组

不,它没有。实际上,memcpy没有任何想法它正在从数组复制或向数组复制。它将其参数视为非结构化内存块的指针。

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

memcpy

这会将memcpy(Dest, &A[a], (b-a) * sizeof(A[0])); 的内容从索引A复制到索引a(独占)到b指向的内存块。如果您还希望将偏移应用于Dest,请使用Dest作为第一个参数。除了&Dest[d],有符号或无符号类型的数组之外,sizeof的乘法是必需的。

答案 2 :(得分:0)

更改最后一行
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[]