【问题标题】:Find what's wrong with this function?发现这个函数有什么问题?
【发布时间】:2021-05-02 17:11:48
【问题描述】:

我认为这段代码没有问题。

void copydata(uint8_t *datato, uint8_t *datafrom, int size)
{
    uint8_t *CurrentAddress = datafrom;
    uint8_t *StopAddress = datafrom + size;
    
    for(;CurrentAddress <= StopAddress;CurrentAddress++)
        *CurrentAddress = *datafrom++;

}

【问题讨论】:

  • 问题是什么?
  • 我的猜测 &lt;= 给出了一个。
  • &lt;= StopAddress 应该是&lt; StopAddress
  • 为什么需要这个功能?它看起来与memcpy(datato, datafrom, size) 相同
  • 你试过编译吗?如果你这样做了,你会得到一个警告,指出出了什么问题。您是否尝试使用该功能?它做了它应该做的事吗?

标签: c for-loop pointers copy function-definition


【解决方案1】:

只有初始化错误...

void copydata(uint8_t *datato, uint8_t *datafrom, int size)
{
    uint8_t *CurrentAddress = datato;      // Needs to be datato, not datafrom
    uint8_t *StopAddress = datato + size;  // Needs to be datato, not datafrom
    
    for(;CurrentAddress <= StopAddress;CurrentAddress++)
        *CurrentAddress = *datafrom++;

}

工作岗位...

也就是说,这是特别糟糕的代码。

【讨论】:

    【解决方案2】:

    函数错误。

    对于初学者来说,它应该被声明为

    void copydata( uint8_t *datato, const uint8_t *datafrom, size_t size );
    

    或者更好地声明它

    uint8_t * copydata( uint8_t *datato, const uint8_t *datafrom, size_t size );
    

    其次是这个循环中的条件

    for(;CurrentAddress <= StopAddress;CurrentAddress++)
    

    应该看起来像

    for( ; CurrentAddress < StopAddress; CurrentAddress++ )
    

    for( ; CurrentAddress != StopAddress; CurrentAddress++ )
    

    最后你试图将数组复制到自身

    uint8_t *CurrentAddress = datafrom;
    //...
    *CurrentAddress = *datafrom++;
    

    函数可以如下所示

    uint8_t * copydata( uint8_t *datato, const uint8_t *datafrom, size_t size )
    {
        
        for ( const uint8_t *StopAddress = datafrom + size; datafrom != StopAddress; ++datafrom )
        {
            *datato++ = *datafrom;
        }
    
        return datato;
    }     
    

    这是一个演示程序。

    #include <stdio.h>
    #include <stdint.h>
    
    uint8_t * copydata( uint8_t *datato, const uint8_t *datafrom, size_t size )
    {
        
        for ( const uint8_t *StopAddress = datafrom + size; datafrom != StopAddress; ++datafrom )
        {
            *datato++ = *datafrom;
        }
    
        return datato;
    } 
    
    int main(void) 
    {
        enum { N = 10 };
        uint8_t a[N];
        uint8_t b[N / 2] = { 1, 2, 3, 4, 5 };
        uint8_t c[N / 2] = { 5, 4, 3, 2, 1 };
        
        copydata( copydata( a, b, N / 2 ), c, N / 2 );
        
        for ( size_t i = 0; i < N; i++ )
        {
            printf( "%d ", a[i] );
        }
        
        putchar( '\n' );
        
        return 0;
    }
    

    程序输出是

    1 2 3 4 5 5 4 3 2 1
    

    另一种方法是使用在标头&lt;string.h&gt; 中声明的标准函数memcpy。例如

    #include <stdio.h>
    #include <stdint.h>
    #include <string.h>
    
    uint8_t * copydata( uint8_t *datato, const uint8_t *datafrom, size_t size )
    {
        return ( uint8_t * )memcpy( datato, datafrom, size * ( sizeof( uint8_t ) ) ) + size;   
    } 
    
    int main(void) 
    {
        enum { N = 10 };
        uint8_t a[N];
        uint8_t b[N / 2] = { 1, 2, 3, 4, 5 };
        uint8_t c[N / 2] = { 5, 4, 3, 2, 1 };
        
        copydata( copydata( a, b, N / 2 ), c, N / 2 );
        
        for ( size_t i = 0; i < N; i++ )
        {
            printf( "%d ", a[i] );
        }
        
        putchar( '\n' );
        
        return 0;
    }
    

    程序输出如上所示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      • 2014-06-29
      • 2011-02-13
      • 2011-04-24
      • 2011-08-26
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多