本帖最后由 刘前辈 于 2012-3-2 12:45 编辑
,
确实写得好,一般人没想到。
#define _MAIN_C_
#include "reg51.h"
#include "main.h"
union bb
{
int cc[10];
};
void main (void)
{
int a[10]={0,1,2,3,4,5,6,7,8,9},b[10]={1,2,3,4,5,6,7,8,9,0};
*(union bb *)a=*(union bb *)b;
while(1);
}
这样就能整体拷贝了!
确实写得好,一般人没想到。
但是如果写成下面:
void main (void)
{
int a[ ]={0,1,2,3,4,5,6},b[ ]={1,2,3,4,5,6,7,8,9,0};
*(union bb *)a=*(union bb *)b; // 程序员写的错误代码
while(1);
}
就会像所长那样,*(struct A)= *(struct A);出现目标缓冲区与源缓冲区的重叠现象,结果造成源缓冲区的数据因程序员的错误赋值行为而产生覆盖。——memcpy( ) 函数的缺点就是不能防止这类覆盖。
所以,可以写成:
void main (void)
{
union bb
{
int cc[10];
}a={ 0,1,2,3,4,5,6},b={1,2,3,4,5,6,7,8,9,0 }; // 编译器保证的内存正确分配。
a = b; // 才是真正的相同类型的结构/联合(标量)整体赋值。
// 由编译器保证了不可能出现目标/源缓冲区的重叠。
while(1);
}
、、 |