C语言一道面试题

[复制链接]
46844|251
highgear 发表于 2012-2-27 00:13 | 显示全部楼层
刘公公啊,说你弱智果然没有说错吧。

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

我都告诉刘公公你了,在 keil c 里结构拷贝就是 memcpy, 刘公公你居然还在强辩,徒留笑柄耳。
刘前辈 发表于 2012-2-28 16:54 | 显示全部楼层
本帖最后由 刘前辈 于 2012-2-28 19:35 编辑
#242楼 highgear
结构拷贝也会出现同样的问题,只要源缓冲区和目标缓冲区是重叠的。


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

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

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

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

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


、、
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; // ??
刘前辈 发表于 2012-2-28 19:58 | 显示全部楼层
(b+4)= b;

行吗?开玩笑了。


、、
highgear 发表于 2012-2-28 22:02 | 显示全部楼层
刘公公的智商..........................................

struct A { char x[4]; };
*(struct A*) (str+2) = *(struct A*) str;
对比
memcpy(str+2,str,4);
sangao0 发表于 2012-2-29 11:04 | 显示全部楼层
a=b;
b=a
菜鸟同学 发表于 2012-2-29 12:00 | 显示全部楼层
写成一个结构体,把a[10]看成是一个类型的数据,直接复制就可以了。
tichar 发表于 2012-3-1 21:51 | 显示全部楼层
158# jimoom
这个答案不错!
rtgchym 发表于 2012-3-2 10:29 | 显示全部楼层
赞7楼一下
刘前辈 发表于 2012-3-2 12:42 | 显示全部楼层
本帖最后由 刘前辈 于 2012-3-2 12:45 编辑
158# jimoom
这个答案不错!



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

  1. #define _MAIN_C_
  2. #include "reg51.h"
  3. #include "main.h"
  4. union bb
  5. {
  6.     int cc[10];
  7. };
  8. void main (void)
  9. {
  10.     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};
  11.     *(union bb *)a=*(union bb *)b;
  12.     while(1);
  13. }

  14. 这样就能整体拷贝了!
确实写得好,一般人没想到。

但是如果写成下面:

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

、、
ytfdhb 发表于 2012-3-2 13:14 | 显示全部楼层
好好看看《C专家编程》,里面有讲解
58180698 发表于 2012-3-5 11:10 | 显示全部楼层
17# wxj1952


哎,得回去看书了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部