我认为这段代码没有问题。
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++;
}
函数错误
对于初学者来说,它应该像
那样声明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
另一种方法是使用在头文件<string.h>
中声明的标准函数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;
}
程序输出如下所示: