一个演示GCC如何返回结构的程序.
一个演示GCC如何返回结构的程序.
编译时候:
gcc -std=c89 trs.c
gcc -std=c99 trs.c
说明c89, c99都一样.
返回的结构变量因为无法用寄存器, 所以用STACK空间. 和返回INT不同的一点是:
返回INT 被调用者知道用EAX, 因为约定了.
而返回结构 被调用者约定了使用STACK, 但不知道在具体位置(无法约定), 所以, 调用者要多传一个指针给被调用者---以便后者将内容放到那里.
但注意, 多传的这个指针绝对不是"返回指针".
[Copy to clipboard] [ - ]CODE:
#include <stdio.h>
typedef struct a {
char buf[128];
} STRU;
STRU *sp;
void func1(int s)
{
int i;
int *ip;
printf("no structure return stack:\n");
for(ip = &i, i = 0; i < 6; i++)
printf("%d %p %p\n", i, ip+i, ip);
printf("\n");
}
STRU func(STRU s)
{
int i;
int *ip;
printf("with sturcture reutrn stack:\n");
for(ip = &i, i = 0; i < 8; i++)
printf("%d %p %p\n", i, ip+i, ip);
printf("func: argument s is at stack %p\n", &s);
s.buf[0]++;
ip = &s;
ip = ip - 1;
sp = *ip;
printf("func: returned var is at stack %p\n", sp);
return s;
}
main(int argc, char **argv)
{
static STRU a, b;
int k = 5;
if(argc > 1) k = atoi(argv[1]);
func1(k);
printf("main: var a in %p, var b in %p\n", &a, &b);
a.buf[0] = k;
a.buf[sizeof(a.buf)-1] = 9;
b = func(a);
printf("main: 2nd var b.buf[0] = %d\n", b.buf[0]);
printf("main: returned var %p s.buf[0] = %d\n", sp, sp->buf[0]);
a.buf[0] += 2;
printf("main: anon var buf[0] = %d\n", func(a).buf[0]);
printf("main: returned var %p s.buf[0] = %d\n", sp, sp->buf[0]);
}