打印

C语言一道面试题

[复制链接]
楼主: wxj1952
手机看帖
扫描二维码
随时随地手机跟帖
241
highgear| | 2012-2-27 00:13 | 只看该作者 回帖奖励 |倒序浏览
刘公公啊,说你弱智果然没有说错吧。

235楼不是 memcpy 的问题,而是刘公公你的智商的问题。"而2个同类型结构拷贝,决不会发生这种情况", 结构拷贝也会出现同样的问题,只要源缓冲区和目标缓冲区是重叠的。

我都告诉刘公公你了,在 keil c 里结构拷贝就是 memcpy, 刘公公你居然还在强辩,徒留笑柄耳。

使用特权

评论回复
242
刘前辈| | 2012-2-28 16:54 | 只看该作者
本帖最后由 刘前辈 于 2012-2-28 19:35 编辑
#242楼 highgear
结构拷贝也会出现同样的问题,只要源缓冲区和目标缓冲区是重叠的。


老爷子早点退休算了,水平一年比一年差。2个结构拷贝会出现缓冲区重叠?哈哈,让人笑掉大牙!老爷子若能像我那样举个例子给大家看看,我输你1,000元!

     难怪讲习所会关大门,基本概念都搞不清:结构变量名是一个标量。什么叫标量?呵呵,玩了一辈子软件,如今年近60了,标量矢量还搞不清。讲了你也不懂:标量就是一个变量的第一特征,它标识一个变量的。(指针矢量是一个变量的第二特征,它标识一个变量的地址)

2 个变量的值可以、可能重叠吗?老所长大牛重叠一个给俺开开眼?否则,只好输1,000元。

2个结构的缓存分配是静态的,在编译阶段就分配好了,结构被编译器视为一个标量整体,怎么可能重叠?!——做编译器的人没你那么逊。什么还没搞清就来给别人讲课。(我那个重叠例子是矢量动态的,是程序行为,编译器不知道。2种情况搞清楚。)
            “要给人一杯水,自己先要有一桶水。”

              自己先把自己装满再来吧。


、、

使用特权

评论回复
243
lxyppc| | 2012-2-28 17:35 | 只看该作者
老爷子早点退休算了,水平一年比一年差。2个结构拷贝会出现缓冲区重叠?哈哈,让人笑掉大牙!老爷子若能像我那样举个例子给大家看看,我输你1,000元!

     难怪讲习所会关大门,基本概念都不懂:结构变量名是一个标量。什么叫标量?呵呵,玩了一辈子软件,如今年近60了,标量矢量还搞不清。讲了你也不懂:标量就是一个变量的第一特征,它标识一个变量的。(指针矢量是一个变量的第二特征,它标识一个变量的地址)

2 个变量的值可以、可能重叠吗?老所长大牛重叠一个给俺开开眼?否则,只好输1,000元。

2个结构的缓存分配是静态的,在编译阶段就分配好了,根本不可能重叠!做编译器的人没你那么逊。什么还没搞清就来给别人讲课。
            “要给人一杯水,自己先要有一桶水。”

自己先把自己装满再来吧。
刘前辈 发表于 2012-2-28 16:54

typedef struct _Test
{
    int d1;
    int d2;
    int d3;
    int d4;
}Test;

Test a,b,c;
Test* p1 = &a;
Test* p2 = &b;
char* p3 = (char*)&a;
a = b;  // ok
*(&a) = *(&b); // ok
*p1 = *p2; // ok
p2 = (Test*) (p3+4);
*p1 = *p2; // ??

使用特权

评论回复
244
刘前辈| | 2012-2-28 19:58 | 只看该作者
(b+4)= b;

行吗?开玩笑了。


、、

使用特权

评论回复
245
highgear| | 2012-2-28 22:02 | 只看该作者
刘公公的智商..........................................

struct A { char x[4]; };
*(struct A*) (str+2) = *(struct A*) str;
对比
memcpy(str+2,str,4);

使用特权

评论回复
246
sangao0| | 2012-2-29 11:04 | 只看该作者
a=b;
b=a

使用特权

评论回复
247
菜鸟同学| | 2012-2-29 12:00 | 只看该作者
写成一个结构体,把a[10]看成是一个类型的数据,直接复制就可以了。

使用特权

评论回复
248
tichar| | 2012-3-1 21:51 | 只看该作者
158# jimoom
这个答案不错!

使用特权

评论回复
249
rtgchym| | 2012-3-2 10:29 | 只看该作者
赞7楼一下

使用特权

评论回复
250
刘前辈| | 2012-3-2 12:42 | 只看该作者
本帖最后由 刘前辈 于 2012-3-2 12:45 编辑
158# jimoom
这个答案不错!



确实写得好,一般人没想到。

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

、、

使用特权

评论回复
251
ytfdhb| | 2012-3-2 13:14 | 只看该作者
好好看看《C专家编程》,里面有讲解

使用特权

评论回复
252
58180698| | 2012-3-5 11:10 | 只看该作者
17# wxj1952


哎,得回去看书了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则