51Testing软件测试网f?O0J
Lz 7、void*和C结构体51Testing软件测试网&] zTX#]V
?f
51Testing软件测试网'c8Xr
Ik)or 问:你能设计一个能接受任何类型的参数并返回interger(整数)结果的函数吗?
"P)aQD.@051Testing软件测试网uO-vFTrH1VKl_ 答:如下:51Testing软件测试网 X!S7n:UvN%D$A
kIwr4V \9Z0
Z
w m's4c){a"TD|051Testing软件测试网n9cy{NC;DF 如果这个函数的参数超过一个,那么这个函数应该由一个结构体来调用,这个结构体可以由需要传递参数来填充。51Testing软件测试网5qk"S(v@$Y5}V!o
51Testing软件测试网DS_/]F_.G,Y^N^ \ 8、*和++操作
2DY)T2K6e$zD0,frjyH.L0 问:下面的操作会输出什么?为什么?
E-RnJ-v5K0fBrV
R051Testing软件测试网W qt(i%`:n8v:u&i;N
- #include<stdio.h>
-
- int main(void)
- {
- char *ptr = "Linux";
- printf("\n [%c] \n",*ptr++);
- printf("\n [%c] \n",*ptr);
-
- return 0;
- }
|
51Testing软件测试网#w,](I6o~:|W 答:输出结果应该是这样:51Testing软件测试网M;KuOoB t6P`
51Testing软件测试网-C5VU)V%D51Testing软件测试网Oc-yA6PY8jN(H4YC
"`V6q2V*}Y(?XL0 因为“++”和“*”的优先权一样,所以“*ptr++”相当于“*(ptr++)”。即应该先执行ptr++,然后才是*ptr,所以操作结果是“L”。第二个结果是“i”。51Testing软件测试网"[n6r.{ N+j
51Testing软件测试网)j.U w)J:p!WF^
N5s 9、问:修改代码片段(或者只读代码)
3t[LWq'C5B$U0
|`nHtdv9HS0 问:下面的代码段有错,你能指出来吗?
+~'w
V8}2Mg/?R6[0-\/EqI']J.l0~G051Testing软件测试网B?_K%fy+S_:n
- #include<stdio.h>
-
- int main(void)
- {
- char *ptr = "Linux";
- *ptr = 'T';
-
- printf("\n [%s] \n", ptr);
-
- return 0;
- }
|
51Testing软件测试网S5H8QM eL,_7T QN(I 答:这是因为,通过*ptr = ‘T’,会改变内存中代码段(只读代码)“Linux”的第一个字母。这个操作是无效的,因此会造成seg-fault或者崩溃。
T8w
W'W#V+[(M/z0*V7@]%Kz~F!g){0 10、会改变自己名字的进程51Testing软件测试网a2A1fk:o(t
vhztu,D0Z0 问:你能写出一个在运行时改变自己进程名的程序吗?51Testing软件测试网8}u*]rQ1]1c'om
~
U | nKHC0 答:参见下面这段代码:
V5BF%W7]F'r;qR0(R0k`n/|+V0
5\7`qk3[0- #include<stdio.h>
-
- int main(int argc, char *argv[])
- {
- int i = 0;
- char buff[100];
-
- memset(buff,0,sizeof(buff));
-
- strncpy(buff, argv[0], sizeof(buff));
- memset(argv[0],0,strlen(buff));
-
- strncpy(argv[0], "NewName", 7);
-
-
-
- for(;i<0xffffffff;i++);
-
- return 0;
- }
|
q*u1Z
Y f {
u
XR0 11、返回本地变量的地址
1mIbu+V0T8R4b6PAZ
e0 问:下面代码有问题吗?如果有,该怎么修改?51Testing软件测试网1`L9~1pko6f
51Testing软件测试网[$tbd`D51Testing软件测试网PPP G6lA-cv#G
- #include<stdio.h>
-
- int* inc(int val)
- {
- int a = val;
- a++;
- return &a;
- }
-
- int main(void)
- {
- int a = 10;
- int *val = inc(a);
- printf("\n Incremented value is equal to [%d] \n", *val);
-
- return 0;
- }
|
,b(aV[ p:~'S:k6EC0 答:尽管上面的程序有时候能够正常运行,但是在“inc()”中存在严重的漏洞。这个函数返回本地变量的地址。因为本地变量的生命周期就是
“inc()”的生命周期,所以在inc结束后,使用本地变量会发生不好的结果。这可以通过将main()中变量“a”的地址来避免,这样以后还可以修改
这个地址存储的值。
A!AzN;hFyUf7d"d0)PQ;G3URq!J0 12、处理printf()的参数51Testing软件测试网5|1m3])WG@d
3xl%Zv!g0V0 问:下面代码会输出什么?
,GUIvRS5h0[SMvel`5X^051Testing软件测试网Xr?-s8S]0?
- #include<stdio.h>
-
- int main(void)
- {
- int a = 10, b = 20, c = 30;
- printf("\n %d..%d..%d \n", a+b+c, (b = b*2), (c = c*2));
-
- return 0;
- }
|
51Testing软件测试网fGn3[ m?V"tc 答:输出结果是:
y d1Oe@Xt051Testing软件测试网5Q%Nrv#J${^G7z4h51Testing软件测试网
t7b,_
r/ET.Q
51Testing软件测试网*Gqshy`4cF 这是因为C语言里函数的参数默认是从右往左处理的,输出时是从左往右。51Testing软件测试网%pQ6PLU8r2N2c o