c语言 - 找出这个函数有什么问题?



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

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

程序输出如下所示:

最新更新