我有一个为某个数组创建副本的函数。我的代码的结构是:
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。但我甚至没有在我的功能中做出断言。有人知道为什么它给我一个断言错误吗?
答案 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 );
}