使用memcpy时出现分段错误

时间:2014-11-07 03:18:18

标签: c malloc memcpy

我有一个关于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));
}

如何将完整数据复制到缓冲区?

4 个答案:

答案 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));
在x86系统上。