我想使用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++];
}
但仍然是错误的。如果您需要更多信息,请不要犹豫!
答案 0 :(得分:1)
我遇到了seg故障,但我不知道从哪里得到这个seg故障?
主要建议:学习使用调试器。它提供了有关错误指令的有用信息。
要回答您对上述问题所示代码段的查询,
to
和from
)对NULL
。正确使用memcpy()
:
根据man page,memcpy()
的签名表示
void * memcpy(void * dest,const void * src,size_t n);
它将n
字节从地址指针复制src
到dest
指向的地址。
另外,非常重要的一点需要注意:
内存区域不得重叠。
因此,要将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[]
。