2016-11-12 37 views
1

我想了解如何复制分配给malloc的内存空间。我假设最好的办法是使用memcpy。中止陷阱:6,使用memcpy复制一个数组

我更熟悉Python。相当于我在Python中试图做的是:

import copy 

foo = [0, 1, 2] 
bar = copy.copy(foo) 

这是我迄今为止。

/* Copy a memory space 
* */ 

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(){ 
    // initialize a pointer to an array of spaces in mem 
    int *foo = malloc(3 * sizeof(int)); 
    int i; 

    // give each space a value from 0 - 2 
    for(i = 0; i < 3; i++) 
     foo[i] = i; 

    for(i = 0; i < 3; i++) 
     printf("foo[%d]: %d\n", i, foo[i]); 

    // here I'm trying to copy the array of elements into 
    // another space in mem 
    // ie copy foo into bar 
    int *bar; 
    memcpy(&bar, foo, 3 * sizeof(int)); 

    for(i = 0; i < 3; i++) 
     printf("bar[%d]: %d\n", i, bar[i]); 

    return 0; 
} 

此脚本的输出如下:

foo[0]: 0 
foo[1]: 1 
foo[2]: 2 
Abort trap: 6 

我编译脚本gcc -o foo foo.c。我在2015年的Macbook Pro。

我的问题是:

  1. 这是为了复制这是使用malloc创建一个数组的最佳方式?
  2. Abort trap: 6是什么意思?
  3. 我只是误解memcpy做什么或如何使用它?

亲切的问候,

马库斯·谢泼德

+3

&地址运算符'bar'没有分配给它的内存,它只是一个未初始化的指针。当你这样做时(就像你为'foo'做的那样),放下'&'并使用'memcpy(bar,foo,3 * sizeof(int));' –

+0

@WeatherVane非常感谢。发布作为答案,如果你想要代表。 – marcusshep

回答

1

变量bar没有分配给它的内存,它只是一个未初始化的指针。

你应该这样做,当你与foo早期

int *bar = malloc(3 * sizeof(int)); 

做了然后你需要为

memcpy(bar, foo, 3 * sizeof(int)); 
+0

啊,我是在memcpy的size参数的前提下为我分配内存的。另外,认为malloc会为我初始化指针,因为它会返回一个指向新内存空间的指针。 – marcusshep

+0

分配内存的唯一C复制函数AFAIK是'strdup'。它不需要'size'参数,但依赖于找到'nul'字符串。 –