我有一个关于memcpy()的基本问题:
我有一个结构,其中有几个数组作为其成员 我想将结构中的数据复制到缓冲区内存中(通过malloc()分配)
我看到了分段错误。我在这个实现中做错了吗?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 10
struct temp {
int en;
int one[MAX];
int two[MAX];
};
int main()
{
struct temp *cpy;
int *buffer, i;
for(i=0; i<MAX; i++) {
cpy->one[i] = i;
cpy->two[i] = i * i;
}
buffer = malloc(3 * MAX * sizeof(int));
memcpy(buffer, cpy, sizeof(struct temp));
}
如何将完整数据复制到缓冲区?
答案 0 :(得分:7)
您从未为cpy
分配空间指向;实际上,您从未为cpy
分配任何价值。
答案 1 :(得分:3)
cpy
只是内存的未初始化指针(引用)。您需要通过在for
循环之前将其指向内存来初始化它。
答案 2 :(得分:1)
首先,您必须为cpy
分配空间。在你的代码中,它只是一个指向任何地方的指针(这会导致未定义的行为尝试并使用它):
cpy = malloc( sizeof *cpy );
之后你可以试试这个:
buffer = malloc( sizeof *cpy );
memcpy(buffer, cpy, sizeof *cpy );
但是这个代码可能存在问题。结构可能包含填充。 (通常它会赢,但这是可能的)。如果有填充,那么你的缓冲区将在实际值之间产生一些垃圾。
要检查没有填充,您可以包括:
STATIC_ASSERT( sizeof *cpy == sizeof *buffer * (2 * MAX + 1) );
如果有填充,你的代码将无法编译,并且你必须单独复制每个成员(实际上这将是我首选的解决方案):
buffer[0] = cpy->en;
memcpy( &buffer[1], cpy->one, MAX * sizeof *buffer );
memcpy( &buffer[1+MAX], cpy->two, MAX * sizeof *buffer );
答案 3 :(得分:0)
只需添加一个unpadded结构,你也可以
struct example {
//...
}__attribute__((packed));