首页 > 解决方案 > 发现这个函数有什么问题?

问题描述

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

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++;

}

标签: cfor-looppointerscopyfunction-definition

解决方案


功能不对。

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

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

另一种方法是使用memcpy在 header 中声明的标准函数<string.h>。例如

#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;
}

程序输出与上图相同。


推荐阅读