2016-11-12 6 views
1

malloc으로 할당 된 메모리 공간을 복사하는 방법을 배우려고합니다. 나는 memcpy를 사용하는 것이 최선의 방법이라고 가정하고있다.트랩 중단 : 6, 배열 복사에 memcpy 사용

저는 파이썬에 대해 더 잘 알고 있습니다. 파이썬에서 내가하려고하는 것과 동등한 것은 다음과 같습니다.

import copy 

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

여기까지가 있습니다.

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

내가 gcc -o foo foo.c로 스크립트를 컴파일하고있어 다음과 같이

/* 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; 
} 

이 스크립트의 출력입니다. 저는 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'문자열 teminator를 찾는 것에 의존합니다. –