2014-11-23 5 views
0

특정 배열에 대해 복제본을 만드는 기능이 있습니다. 내 코드에 대한 구조체입니다 : 내가 쓴C에서 memcpy 후에 어설 션이 실패했습니다

typedef struct { 
    int* data; 
    unsigned int len; 
} intarr_t; 

기능은 다음과 같습니다 나는 기능을 시험 할 때

intarr_t* intarr_copy(const intarr_t* ia) 
{ 
    unsigned int len; 
    intarr_t* newia = malloc(sizeof(intarr_t)); 
    assert (newia); 
    newia->data = malloc(sizeof(int)*len); 
    newia->len = len; 
    if (newia == 0) 
    { 
     return NULL; 
    } 
    else 
    { 
     memcpy (newia->data, ia->data, len*sizeof(int)); 
    } 
    return 0; 
} 

, 그것은 내 기능을 중지 및 IA에 대한 내 주장이 실패했음을 밝혔다. 내가 ia를 가지고있는 유일한 곳은 memcpy이다. 그러나 나는 내 기능에 단언조차하지 않았다. 아무도 내가 왜 단언 오류를 준지 알 수 있습니까? 당신이 충돌을 볼 수 있도록 len의 값이 결정되지이 라인에서

memcpy (newia->data, ia->data, len*sizeof(int)); 

: 때문에

+0

이유는 'len' 변수를 결코 값으로 초기화 할 수 없다는 것입니다. 'unsigned int len ​​= ia-> len; –

+0

len이 초기화되지 않았다는 것을 의미 할 가능성이 큽니다. 또한 코드를 일관되게 유지하고 혼합하지 않도록하십시오. 'NULL','0'과 같은 것을 의미합니다. 또 다른 것은'newia'가 적절하게 할당되었는지 나중에 if 문으로 검사하는지 당신이 주장하는 것입니다. ... –

+0

'서명되지 않은 int len ​​= ia-> len;'및 intXXX_t는 시스템 예약 된 이름입니다. – BLUEPIXY

답변

1

당신이 충돌을보고있는 이유입니다. len도 초기화되지 않고 len의 값이 초기화없이 불확실 해 지므로 올바르지 않은 함수의 여러 위치에서 초기화되지 않고 사용되고 있습니다.

코드에서 중복되는 많은 것들이 있습니다. 단지

intarr_t* newia = malloc(sizeof(intarr_t)); 

if(newia == NULL) 
{ 
printf("Memory allocation failed\n"); 
return; 
} 

으로 malloc()를 호출 한 후 메모리 할당 성공 또는 실패에 대한

확인 그래서 이렇게 당신은 잘못된 메모리를 액세스 할 수 없습니다.

다음으로 명명 규칙이 너무 약합니다. 당신은 intarr_t과 같은 것이 아닌 읽을 수있는 typedef를 가지고 있어야합니다.

+0

@MattMcNabb 지적 해 주셔서 감사합니다. 내 대답을 업데이트했습니다. – Gopi

0
// the following is assuming that 'len' is the number of ints in the memory 
// pointed to by 'data' 
// I would strong suggest you use variable names that indicate 
// if something is a pointer 
// (typically by pre-pending 'p' 
// and capitalizing the first letter of the rest of the variable name) 

intarr_t* intarr_copy(const intarr_t* ia) 
{ 

    intarr_t* newia = malloc(sizeof(intarr_t)); 

    if(NULL == newia) 
    { // then, malloc failed 
     perror("malloc failed for intarr_t")' 
     exit(EXIT_FAILURE); 
    } 

    // implied else, malloc for intarr_t successful 

    newia->data = malloc(sizeof(int)*ia->len); 

    if(NULL == newia->data) 
    { // then malloc failed 
     perror("malloc failed for int array"); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, malloc of data array successful 

    // set fields in newia 
    newia->len = ia->len; 
    memcpy (newia->data, ia->data, (sizeof(int)*ia->len)); 

    return(newia); 
}