从struct到array的不完整副本

时间:2014-02-07 22:02:13

标签: c arrays struct memcpy

我定义了:

 #define arrayLengthInStruct 50

 typedef struct {
  struct {
        int _buf[arrayLengthInStruct];           
        int _bufLen;
 } _context;
} _handle;

在main()

_handle handlePtr;
_handle* handle = (_handle*) &handlePtr;   // data is here
int* k_src = NULL; // to be loaded to
int i = 0;

handlePtr._context._bufLen = arrayLengthInStruct;
// initialize the source
for (i = 0; i < handlePtr._context._bufLen; i++) {
    handlePtr._context._buf[i] = i+1;
    printf("%d \t", handlePtr._context._buf[i]);
}
printf("\n");

k_src = malloc(sizeof(int)*(handlePtr._context._bufLen)); 
printf("Amount of data to copy: %d \n", handle->_context._bufLen);   


  memcpy ( k_src,
  &handle->_context._buf[0],
   handle->_context._bufLen
 );

for (i = 0; i < handlePtr._context._bufLen; i++) {
    printf("%d \t", k_src[i]);
}
printf("\n");

但是,副本不完整。我错过了什么?

输出: / * 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

要复制的数据量:50

1 2 3 4 5 6 7 8 9 10 11 12 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * /

2 个答案:

答案 0 :(得分:4)

memcpy的第三个参数是要复制的字节的数量。您提供了int s的数量。这样做:

memcpy ( k_src,
&handle->_context._buf[0],
 handle->_context._bufLen * sizeof(int)
);

答案 1 :(得分:4)

您错过了memcpy复制多个字节而不是整数的事实。与sizeof(int)一起使用时,您需要将数组大小乘以memcpy

在具有四字节int类型的小端机器上,复制50个字节会给你所看到的(50/4 = 12.5)尽管最后一个元素{{1将取决于目标内存中已有的内容。