在给定要求的情况下,我应如何处理此C if语句的实现?

时间:2014-11-20 18:41:23

标签: c

我目前正在尝试创建满足以下要求的源代码:

要求:

//从索引优先到最后一个索引获取数组部分的深层副本

//包容性。如果成功,则返回指向新分配的包含指定部分副本的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语句吗?

2 个答案:

答案 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;
}