2014-11-23 2 views
0

У меня есть функция, которая создает дубликат для определенного массива. Структура для моего кода:Утверждение не выполнено после memcpy в c

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, - это memcpy. Но я даже не сделал никаких утверждений в своей функции. Кто-нибудь знает, почему это дало мне ошибку утверждения?

+0

Причина может заключаться в том, что вы никогда не инициализируете свою переменную 'len' значением. Вероятно, вы действительно хотите сделать что-то вроде 'unsigned int len ​​= ia-> len;' –

+0

len неинициализирован. также старайтесь держать код когерентным и не смешивать. 'NULL',' 0' и тому подобное, если вы действительно имеете в виду то же самое. Другое дело, что вы утверждаете, что если 'newia' должным образом распределяется и чем позже проверяет его с помощью оператора if. Я действительно не знаю, что этот код даже должен делать, поскольку вы копируете случайные объемы данных в зависимости от len ... –

+0

'unsigned int len ​​= ia-> len;' и intXXX_t - системное зарезервированное имя. – BLUEPIXY

ответ

1

Причины вы видите крах потому, что:

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

В этой строке значение len неопределенно, так что вы видите аварии. Также мы видим, что len является неинициализированным и используется в нескольких местах в функции, которая неверна, поскольку значение len будет неопределенным без инициализации.

Кроме того, есть много вещей, которые излишни в вашем коде.

Проверка на успех выделения памяти или сбой только после вызова таНоса()

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

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

Так что, делая это, вы не доступ к неправильному участку памяти.

Далее, ваши соглашения об именах слишком бедны. У вас должен быть читаемый typedef не что-то вроде intarr_t.

+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); 
} 
Смежные вопросы