英华达 认领
计算机/互联网/通信/电子 上海 500-1000人 合资(非欧美)
简单自我接受,而后就出个到编程题目
把起始地址为A,长度为L的内存中的数据复制到起始地址为B,长度为L的内存中去。开始我觉得太简单了,我是这样写的<br><br>void memcopy(int * A,int * B, int L)<br><br>{<br><br> int i;<br><br> for(i = 0; i < L; i++){<br><br> *A++ = *B++;<br><br> }<br><br>}<br><br> 然后面试的人看了,问我觉得有没有问题,我看了看,觉得没什么问题,就告诉他没有问题,然后他就说假如B < A + L呢,这我知道了,要是这样的话,内存中就有一部分会被覆盖,这样做确实有问题。然后我就想从后面往前面移动,但这样也不行,假如A < B + L这样内存中也必定有一部分被覆盖掉。下面是我的第二次的回答<br><br>void memcopy(int * A,int * B, int L)<br><br>{<br><br> int i;<br><br> int *P = (int *)malloc(L * sizeof(int));<br><br> int *P1 = P;<br><br> for(i = 0; i < L; i++){<br><br> *P++ = *A++;<br><br> }<br><br> for(i = 0; i < L; i++){<br><br> *B++ = *P++;<br><br> }<br><br>}<br><br>当然上面是假定内存申请总是成功的。<br><br>然后面试官告诉我,当L非常大的时候,程序效率非常低。是啊,这样的话,程序的效率确实非常低。我就想可以分成三种情况,当B < A + L,我就从后面往前面倒着复制,当B == A的时候,就不复制,其他情况就从前面往后面复制。<br><br>各位,抱着学习提高的态度,我不知道这种内存复制还会出现一些什么样的异常情况,还有什么好的方法来实现这种内存复制?
正在加载验证码...
英华达软件工程师面试经验&面试问题
面试问题
简单自我接受,而后就出个到编程题目
面试过程
把起始地址为A,长度为L的内存中的数据复制到起始地址为B,长度为L的内存中去。开始我觉得太简单了,我是这样写的<br><br>void memcopy(int * A,int * B, int L)<br><br>{<br><br> int i;<br><br> for(i = 0; i < L; i++){<br><br> *A++ = *B++;<br><br> }<br><br>}<br><br> 然后面试的人看了,问我觉得有没有问题,我看了看,觉得没什么问题,就告诉他没有问题,然后他就说假如B < A + L呢,这我知道了,要是这样的话,内存中就有一部分会被覆盖,这样做确实有问题。然后我就想从后面往前面移动,但这样也不行,假如A < B + L这样内存中也必定有一部分被覆盖掉。下面是我的第二次的回答<br><br>void memcopy(int * A,int * B, int L)<br><br>{<br><br> int i;<br><br> int *P = (int *)malloc(L * sizeof(int));<br><br> int *P1 = P;<br><br> for(i = 0; i < L; i++){<br><br> *P++ = *A++;<br><br> }<br><br> for(i = 0; i < L; i++){<br><br> *B++ = *P++;<br><br> }<br><br>}<br><br>当然上面是假定内存申请总是成功的。<br><br>然后面试官告诉我,当L非常大的时候,程序效率非常低。是啊,这样的话,程序的效率确实非常低。我就想可以分成三种情况,当B < A + L,我就从后面往前面倒着复制,当B == A的时候,就不复制,其他情况就从前面往后面复制。<br><br>各位,抱着学习提高的态度,我不知道这种内存复制还会出现一些什么样的异常情况,还有什么好的方法来实现这种内存复制?