在memcpy中c断言后断言失败

时间:2014-11-23 08:51:00

标签: c memcpy assertion

我有一个为某个数组创建副本的函数。我的代码的结构是:

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。但我甚至没有在我的功能中做出断言。有人知道为什么它给我一个断言错误吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 );
}