|
发表于 2009-12-18 15:49:47
|
显示全部楼层
看了"wuzhujian 吴助建"的经历我很佩服,我是一个才毕业的学生,应该多听听你们的故事
这样更能确定自己以后的技术路线.
不过我觉得test(*p)这样的例子,其实是很简单的,能做对不能说明自己牛,更多的人做不对,是他们的技术不行
关键是没有理解C语言中函数调用的机制,只有值传递,其实反汇编一下马上就知道了
源代码如下:
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
void test(TCHAR * cp)
{
cp = TEXT("This is in test\n");
}
int main(void)
{
TCHAR * cp = TEXT("This is in main\n");
test(cp);
_tprintf(TEXT("%s"), cp);
return 0;
}
反汇编代码如下,为了便于阅读,我只给出了调试版的反汇编代码,这里只列出关键点:
15: test(cp);
0040106F mov eax,dword ptr [ebp-4]
00401072 push eax ; push的时候会建立一个副本
00401073 call @ILT+0(test) (00401005) ; 这里是调用test函数
00401078 add esp,4
push eax在堆栈上建立了一个内存副本,在进入test之前副本的值和指针cp的值一样,再来看test里面:
00401020 push ebp ;
00401021 mov ebp,esp ;
00401023 sub esp,40h ; 这些指令都是堆栈框架
00401026 push ebx
00401027 push esi
00401028 push edi
00401029 lea edi,[ebp-40h]
0040102C mov ecx,10h ;
00401031 mov eax,0CCCCCCCCh ;
00401036 rep stos dword ptr [edi] ;上面这些指令是初始化局部变量,因为是DEBUG版本,所以......
8: cp = TEXT("This is in test\n");
00401038 mov dword ptr [ebp+8],offset string "This is in test\n" (0042001c)
9: } ; 这句很关键,修改是只是main传进来的副本,所以.........
0040103F pop edi
00401040 pop esi
00401041 pop ebx
00401042 mov esp,ebp
00401044 pop ebp
00401045 ret
不过我见过很多很有经验的'底层'开发人员,他们更注重解决问题的能力,我觉得开发软件不仅仅是解决问题的能力,更重要的是把问题给解决好,这才是重要的,写程序其实没什么难的,写出好的代码,则很难......
现在国内的软件开发走向了两个极端,做底层的 不讲究开发方法,不讲究代码质量,就光写代码,到头来,这样的代码没人能够维护,而做上层的开发人员则刚好相反,只讲开发方法,却没有技术内涵,可能就会出现您说的那种来C语言的参数传递机制都不知道. |
|