【问题标题】:Why doesn't this reverse function work correctly?为什么这个反向功能不能正常工作?
【发布时间】:2015-03-03 14:15:35
【问题描述】:
return_code swap_int_buffer(int* buffer, int size, int index1, int index2) {        
    if(index1 <0 || index2<0){
        return INVALID_ARGUMENT_NEGATIVE;
    } else if(index1 > size || index2 >size){
        return INVALID_INDEX_OUT_OF_BOUNDS;
    }else{
        int *bucket;
        int i;
        int j;

        bucket = (int*)malloc(sizeof(int)*size);
        for(i = size - 1, j = 0; i>=0; i--, j++){
            *(bucket+j) = *(buffer+i);
    }       
    for(i=0; i<size; i++){
        *(buffer+i) = *(bucket+i);      
    }       
    return SUCCESS;     
}

return NOT_IMPLEMENTED;
}

我不明白为什么当我测试这段代码时它不能正常工作,测试是由我的大学提供的,该函数旨在反转一个 int 数组。我错过了什么吗?感谢您的帮助:)

【问题讨论】:

  • 在调试器中运行并逐行执行代码。和don't cast the result of malloc in C。然后记住,例如*(buffer + i) 等价于 buffer[i] (对许多人来说更容易阅读,而要少写一个字符 :)。您是否有理由不使用例如memcpy复制内存?
  • 你能解释一下你期望这个函数应该做什么,以及它现在做什么?
  • @JoachimPileborg 我对 C 很陌生,所以我不知道很多库函数,memcpy 是做什么的?
  • @CallumSangray ,谷歌它。从它的名字看,它复制了内存。
  • @Callum Sangray 该函数存在内存泄漏。我认为您必须在不分配额外内存的情况下将数组反转到位。如果函数接受开始和结束索引,那么传递数组的大小也没有任何意义。

标签: c function reverse


【解决方案1】:

我认为你的函数声明(和定义)没有任何意义。

我会这样写函数

void reverse( int *a, size_t n )
{
   for ( size_t i = 0; i < n / 2; i++ )
   {
      int x = a[i];
      a[i] = a[n-i-1];
      a[n-i-1] = x;
   }
}    

如果您有一个名为 a 的数组,并且想要从索引 i1 开始并以索引 i2 结束,那么您可以通过以下方式调用该函数

reverse( a + i1, i2 - i1 + 1 );

这样的函数应该写得尽可能简单。所有参数的检查都应该在函数的调用者中完成。如果您愿意,可以使用您显示的签名为函数编写一个包装器。还要考虑到再次声明索引具有 int 类型而不是 size_t 是没有意义的。

如果函数必须像你展示的那样声明,那么它可以这样定义(无需测试)

return_code swap_int_buffer( int *buffer, int size, int index1, int index2 ) 
{        
    if ( index1 < 0 || index2 < 0 )
    {
        return INVALID_ARGUMENT_NEGATIVE;
    } 
    else if( index1 >= size || index2 >= size )
    {
        return INVALID_INDEX_OUT_OF_BOUNDS;
    }
    else if ( index2 < index1 )
    {
        return NOT_IMPLEMENTED;
    }
    else
    {
        int n = index2 - index1 + 1;
        buffer += index1;

        for ( index1 = 0; index1 < n / 2; index1++ )
        {
            int x = buffer[index1];
            buffer[index1] = buffer[n-index1-1];
            buffer[n-index1-1] = x;
        }

        return SUCCESS;
    }     
}

【讨论】:

  • 我不能改变函数的参数,必须按照我试过的方式编码
  • @Callum Sangray 在什么情况下函数应该返回 NOT_IMPLEMENTED?
  • 它作为故障保险装置在那里,它不必在那里,因为它可能永远不会做任何事情,但它在 err_code 枚举中,由 uni 提供
猜你喜欢
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多