打印

一个演示GCC如何返回结构的程序.

一个演示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]);

}

TOP


感谢一直以来您对我们的支持!
当前时区 GMT+8, 现在时间是 2008-9-6 04:50 京ICP证060528 号

Designed By 17DST