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


person John Claser    schedule 23.11.2014    source источник
comment
Причина может заключаться в том, что вы никогда не инициализируете свою переменную len значением. Скорее всего, вы действительно хотите сделать что-то вроде unsigned int len = ia->len;   -  person Joachim Isaksson    schedule 23.11.2014
comment
len не инициализирован. также старайтесь, чтобы ваш код был последовательным и не смешивался. NULL, 0 и тому подобное, если вы действительно имеете в виду одно и то же. другое дело, что вы утверждаете, правильно ли распределено newia, а затем проверяете его с помощью оператора if. Я действительно не знаю, что этот код вообще должен делать, поскольку вы копируете случайные объемы данных в зависимости от длины...   -  person rowan.G    schedule 23.11.2014
comment
unsigned int len = ia->len; и intXXX_t — зарезервированное системой имя.   -  person BLUEPIXY    schedule 23.11.2014


Ответы (1)


Причина, по которой вы видите сбой, заключается в том, что:

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

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

Далее в вашем коде много лишнего.

Проверка успешного или неудачного выделения памяти сразу после вызова malloc()

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

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

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

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

person Gopi    schedule 23.11.2014
comment
@MattMcNabb Спасибо, что заметили это, я обновил свой ответ. - person Gopi; 23.11.2014