【问题标题】:Copying unsigned char in C在C中复制无符号字符
【发布时间】:2015-04-07 09:47:52
【问题描述】:

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

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

【问题讨论】:

  • memcpy 没有数组的概念,它以源地址和目标地址作为参数复制多个字节。
  • 如果bytes是要复制的字节数,那么你复制的太多了;结束条件应该是&lt; 而不是&lt;=
  • 请说明offsetfrom 的偏移量,还是to 的偏移量。 (目前您正在从 from 的开头读取,并将偏移量应用于 to)。如果您可以包含一些调用此函数并显示预期输入和输出的代码,那就更好了。

标签: c arrays pointers segmentation-fault memcpy


【解决方案1】:

我遇到了段错误,但我不知道我从哪里得到这个段错误?

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


回答您对上述问题中显示的代码sn-p的查询,

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

正确使用memcpy()

根据man pagememcpy()的签名表示

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

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

还有一点非常重要:

内存区域不能重叠。

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

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

【讨论】:

  • 哦,是的!我想第二个可能是这样!谢谢你的提醒!让我设置一下然后再试一次 =]
【解决方案2】:

在我看来 memcpy 从一开始就复制数组

不,它没有。事实上,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 应用偏移量,请使用&amp;Dest[d] 作为第一个参数。对于 char 以外的类型(有符号或无符号)的数组,需要乘以 sizeof

【讨论】:

  • 应该是b-a 而不是A[b]-A[a]
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2011-05-29
    • 2021-10-17
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    相关资源
    最近更新 更多