我目前正在尝试创建满足以下要求的源代码:
要求:
//从索引优先到最后一个索引获取数组部分的深层副本
//包容性。如果成功,则返回指向新分配的包含指定部分副本的intarr_t的指针。
//如果发生错误,即数组为空,则第一个或最后一个超出范围,最后一个<首先,或内存分配失败,返回空指针。
我已经完成了前两个要求,但似乎我对第三个要求的逻辑是错误的,无论我测试多少,我似乎无法找到发生的角落情况。
我的代码:
intarr_t* intarr_copy_subarray( intarr_t* array,
unsigned int first,
unsigned int last )
{
intarr_t *tmp;
tmp = malloc((last-first)*sizeof(intarr_t));
// it seems that my if statement is not meeting the requirement in bold.
if(first>=0 && last<= array->len && array != NULL && first > last && tmp != NULL)
{
//perform copying here
return tmp; // pointer to new array containing the copied stuff
}
else
{
return NULL;
}
}
typedef struct {
int* data;
unsigned int len;
} intarr_t;
似乎有一种情况,它不应该返回NULL,并且它与我的if语句有关。请注意,我传递的函数是一个typedef结构,其中包含一个指向数组和长度的指针,但这不是问题所在。我应该使用OR语句而不是AND语句吗?
答案 0 :(得分:1)
首先检查NULL:
if( !array )
return NULL ;
然后不要分配,但检查参数是否在边界内:
if( first>=0 && last< array->len && first <= last )
{
然后分配内存,如果成功将数组复制到新的子数组。
鉴于intarr_t
(_t是一个保留的标识符),您的示例分配不正确,保存指向int数组的指针。您应该分配一个intarr_t
,然后分配它指向的数组:
intarr_t tmp = malloc(sizeof(intarr_t)) ;
if( tmp )
{
tmp->data = malloc( sizeof( int ) * ( last - first + 1 ) ) ;
//check if malloc succeeded again
tmp->len = last - first + 1 ;
...
答案 1 :(得分:0)
该功能可以看起来像
intarr_t* intarr_copy_subarray( const intarr_t *array,
unsigned int first,
unsigned int last )
{
if ( array == NULL || array->data == NULL || last < first || array->len <= last )
{
return NULL;
}
intarr_t *tmp = malloc( sizeof( intarr_t ) );
if ( tmp )
{
tmp->data = malloc( ( last - first + 1 ) * sizeof( int ) );
if ( tmp->data == NULL )
{
free( tmp );
tmp = NULL;
}
else
{
tmp->len = last - first + 1;
for ( unsigned int i = 0; i < tmp->len; i++ )
{
tmp->data[i] = array->data[first + i];
}
}
}
return tmp;
}