一个或者多个字的返回值
假如main()函数的返回值是void而不是int会怎么样?
通常启动函数调用main()为:
换句话说为
如果main()声明为void类型并且函数没有明确返回状态值,通常在main()结束时EAX寄存器的值被返回,然后作为exit()的参数。大多数情况下函数返回的是随机值。这种情况下程序的退出代码为伪随机的。
我们看一个实例,注意main()是void类型:
#include <stdio.h>
void main()
{
printf ("Hello, world!");
};
GCC 4.8.1会使用puts()替代printf()(看前面章节2.3.3),没有关系,因为puts()会返回打印的字符数,就行printf()一样。请注意,main()结束时EAX寄存器的值是非0的,这意味着main()结束时保留puts()返回时EAX的值。
Listing 8.1: GCC 4.8.1
.LC0:
.string "Hello, world!"
main:
push ebp
mov ebp, esp
and esp, -16
sub esp, 16
mov DWORD PTR [esp], OFFSET FLAT:.LC0
call puts
leave
ret
我们写bash脚本来看退出状态:
Listing 8.2: tst.sh
运行:
$ tst.sh
Hello, world!
14
14为打印的字符数。
小例子:
{
int a;
int b;
int c;
};
struct s get_some_values (int a)
{
struct s rt;
rt.a=a+1;
rt.b=a+2;
rt.c=a+3;
return rt;
};
…我们可以得到(MSVC 2010 /Ox):
内部变量传递指针到结构体的宏为$T3853。
这个例子可以用C99语言扩展来重写:
struct s
{
int a;
int b;
};
struct s get_some_values (int a)
{
return (struct s){.a=a+1, .b=a+2, .c=a+3};
};
Listing 8.3: GCC 4.8.1
_get_some_values proc near
ptr_to_struct = dword ptr 4
a = dword ptr 8
mov edx, [esp+a]
mov eax, [esp+ptr_to_struct]
lea ecx, [edx+1]
mov [eax], ecx
lea ecx, [edx+2]
add edx, 3
mov [eax+4], ecx
mov [eax+8], edx
retn
我们可以看到,函数仅仅填充调用者申请的结构体空间的相应字段。因此没有性能缺陷。 # 指针