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
另一种方法是使用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;
}
程序输出与上图相同。
推荐阅读
- c# - 如何在 C# 中使用动态和静态键名反序列化 JSON
- concurrency - AWS Lambda 时间负载均衡
- swift - 使用 ARKit 3.0 在 iPhone XR 上进行人物分割
- iis - 如何将所有 IIS 设置、配置、应用程序池从一个 IIS 框复制到另一个?
- .net - JWT 令牌签名在 jwt.io 中有效,但在我的代码中无效
- javascript - JavaSctript Promise.all 在地图上
- angular - Angular Breadcrumb 显示用户到达当前页面的路径
- django - DateTimeField 到 str 并从 str 读取
- python - subprocess + service network-manager 是禁用网络的好方法吗?
- tensorflow - 替换tensorflow 2.0中损失函数的梯度计算