打印

google下林锐,高手编程指南,很短的几篇**

[复制链接]
20056|77
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ccjchen|  楼主 | 2007-11-12 21:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我本来投的是硬件,可是硬件已经招满,就给俺分到软件组去面试了,郁闷!
面试官给俺出了一个题,说是怎样将n个字节从一个地址拷贝到另一个地址,要用一个完整的函数表达出来,有两点,必须n个字节,必须是一个完整的函数。
我随便写了一个,看他那眼色,肯定不对。
然后他又问我写出的函数中,全局变量放在数据存储区什么地方,局部变量放在什么地方,俺一个汗阿,平时用C语言从来没管这些,请各位大虾在这里给我解答一下好吗?

相关帖子

沙发
computer00| | 2007-11-12 21:08 | 只看该作者

还是先把你写的函数帖上来瞧瞧吧~~~~`

使用特权

评论回复
板凳
mohanwei| | 2007-11-12 21:20 | 只看该作者

要用到全局变量么?

void _memcpy(uchar *t,uchar *s,ulong Len)
{
    while(Len--)
    {
       (*t++)=(*s++);
    }
}

使用特权

评论回复
地板
happystar| | 2007-11-12 21:26 | 只看该作者

楼上正解

另外:全局变量放在RAM里,局部变量堆栈里。

使用特权

评论回复
5
computer00| | 2007-11-12 22:03 | 只看该作者

敢问4楼的,难道栈就不是RAM了吗?

使用特权

评论回复
6
kcl123| | 2007-11-12 22:09 | 只看该作者

怎么还有人去这种要钱不要命的企业去?

真是人穷了,志短啊!!!

使用特权

评论回复
7
happystar| | 2007-11-12 22:15 | 只看该作者

re

是呀,堆栈确实是RAM,但是那该怎么说呢?我估计那个考官就让LZ说局部变量是在堆栈了。
一个程序可以分为
代码区:存放程序的代码,即程序中的各个函数代码块。
全局数据区:存放程序的全局数据和静态数据。
堆区:存放程序的动态数据。
栈区:存放程序的局部数据,即各个函数中的数据。

使用特权

评论回复
8
uc.c| | 2007-11-12 22:21 | 只看该作者

RE

这不就是当时考林锐博士的一道难?

使用特权

评论回复
9
ocon| | 2007-11-13 03:45 | 只看该作者

3楼没错,是我错了。

一眼看上去还以为是先执行len--然后再判断的。

使用特权

评论回复
10
ayb_ice| | 2007-11-13 07:59 | 只看该作者

3L的没有错误啊

使用特权

评论回复
11
wangkj| | 2007-11-13 08:44 | 只看该作者

如果len <0或者==0呢?

使用特权

评论回复
12
xwj| | 2007-11-13 08:51 | 只看该作者

如果len <0或者==0呢?--那就是2^32+len个

也不能说是错

使用特权

评论回复
13
walnutcy| | 2007-11-13 10:59 | 只看该作者

3L用的是无符号数,不会小于0,len为0,则直接退出

使用特权

评论回复
14
古道热肠| | 2007-11-13 11:03 | 只看该作者

加入容错设计,uLong >= 0

void MemoryCopy(uchar *pDestDataBuff,uchar *pSrcDataBuff,ulong ulLen)
{

    if(ulLen != 0)
    {

       while(ulLen--)
       {
           (*pDestDataBuff++)=(*pSrcDataBuff++);
        }
    }
}

这样答题,也许能过关。

使用特权

评论回复
15
skey79| | 2007-11-13 12:46 | 只看该作者

古版的这个容错可以不要的

个人认为:古版的这个if(ulLen != 0)可以不要的,
while(ulLen--)已经很好了。它相当于while(ulLen) ulLen--;{};


使用特权

评论回复
16
ccjchen|  楼主 | 2007-11-13 14:04 | 只看该作者

谢谢各位大虾,7楼happystar说的堆区和栈区分别是什么意思呢

既然使用C语言时能自动分配内存空间,那为什么还要考虑这些呢?
他还问了我一个问题,就是既然我的毕业设计写了很多程序,那么我的程序是从什么地方开始运行的呢?然后让我写了一个流程图,我说是从单片机初始化的时候已经开始运行了,哈哈!
这些基本问题我过去从来没有注意过,我不明白他说的什么意思,大虾们再给解释一下吧

使用特权

评论回复
17
cf_lite| | 2007-11-13 17:37 | 只看该作者

haha

他可能是想考你对MCU上电复位的理解。
C程序的,text,data,bss,stack等段在内存中是怎么布局的。什么变量会放在什么段里面,如何控制一个变量放到你希望的位置等等。
这些东西都比较简单。看看link script,看看boot loader,很快就能弄得很明白了,没有他们说的那么玄乎。

使用特权

评论回复
18
IC1008| | 2007-11-13 18:02 | 只看该作者

我的才最正确

void MemCopy(void *t,void *s,void len)
{
 unsigned char *t1,*s1;
 t1=(unsigned char *)t;
 s1=(unsigned char *)s;
 while(Len--)(*t1++)=(*s1++);
}

使用特权

评论回复
19
lenglx| | 2007-11-13 18:50 | 只看该作者

呵呵,

个人以为,那不是关键.

ASSERT可能有用,但多半不是考官的意图所在.
我想他可能是对你声明函数原型有意见,说不定.

char * _memcpy(char * _d, char const * _s, unsinged int len)
{
  while(len--)
  {
    *_d++ = *s++;
  }
  return _d;
}

使用特权

评论回复
20
马奋| | 2007-11-13 22:18 | 只看该作者

局部变量放在哪和编译器和芯片有关系吧?

使用特权

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

本版积分规则

175

主题

446

帖子

1

粉丝