在 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?
主要建议:学习使用调试器。它提供有关错误指令的有用信息。
为了回答您对上述问题中显示的代码片段的查询,
- 在取消引用之前,根据
NULL
检查传入的指针(to
和 from
)。
- 检查所用索引的边界限制。目前他们可以超出分配的内存。
正确使用memcpy()
:
根据man page,memcpy()
的签名表示
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[]
.
我想使用 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?
主要建议:学习使用调试器。它提供有关错误指令的有用信息。
为了回答您对上述问题中显示的代码片段的查询,
- 在取消引用之前,根据
NULL
检查传入的指针(to
和from
)。 - 检查所用索引的边界限制。目前他们可以超出分配的内存。
正确使用memcpy()
:
根据man page,memcpy()
的签名表示
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[]
.