打印

C51函数返回值类型的一些问题~~帮忙看看~

[复制链接]
4486|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhh124|  楼主 | 2007-9-17 21:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近用C51写程序,碰到点问题.

函数返回值是结构体指针类型的,则输出不正确..
如果是返回结构体类型的,结果正确..
下面是我写来做试验的程序..

#include    <reg52.h>
#include    <stdio.h>

struct    test
{
    int    a;
    int    b;
};

//返回结构体的试验函数
struct    test *    func1(void);   //不行
struct    test     func3(void);   //行

//返回数组的试验函数
int *    func8(int a[]);    //行
int *    func9(void);    //不行
void    func10(int a[]);    //行

main()
{
    struct    test *    tt;
    struct    test    tt1;
    int    aa[2];
    int    *a;
    int x,y;

    SCON = 0x52;    /* SCON */ /* setup serial port control */
    TMOD = 0x20;    /* TMOD */ /* hardware (2400 BAUD @12MHZ) */
    TCON = 0x69;    /* TCON */
    TH1 =  0xf3;    /* TH1 */

    tt = func1();   //tt->a = 11, tt->b = 22
    x = tt->a;      //但这里 x,y取得的值不正确 x = 0
    y = tt->b;      // x = 12, y = 12
    printf("%d ", tt->a); //print 11
    printf("%d ", tt->b); //打印完11后 tt1里面的a,b的值就变了~

    tt1 = func3();  //tt1.a = 31, tt1.b = 32
    printf("%d ", tt1.a);   // print 31
    printf("%d ", tt1.b);   // print 32

    a = func8(aa); // 
    printf("%d ", *a);
    printf("%d ", *(a+1));

    a = func9();   //
    x = *a;
    y = *(a + 1);
    printf("%d ", *a);
    printf("%d ", *(a+1));

    func10(aa);    //
    printf("%d ", aa[0]);
    printf("%d ", aa[1]);

    return;
}

struct    test *    func1(void)
{
    struct    test     t1;
    t1.a = 11;
    t1.b = 12;
    return    &t1;
}

struct    test     func3(void)
{
    struct    test     t1;
    t1.a = 31;
    t1.b = 32;
    return    t1;
}

还有就是要返回数组变量的问题.
数组变量是不能直接作为函数参数返回的,那么只能通过数组指针来返回了?
写了几个函数,将数组作为参数传入函数,返回值为void或者数组指针没问题.
当我在函数里面定义了一个数组,用数组指针返回时就不行了~这是什么原因?

//函数
int *    func8(int a[])
{
    a[0] = 81;
    a[1] = 82;
    return    a;
}

int *    func9(void)
{
    int    a[2];
    a[0] = 91;
    a[1] = 92;
    return    a;
}

void    func10(int a[])
{
    a[0] = 101;
    a[1] = 102;
    return;
}
沙发
ayb_ice| | 2007-9-18 07:34 | 只看该作者

没有仔细看,但肯定可以,可能是你用错了...

使用特权

评论回复
板凳
lenglx| | 2007-9-18 15:02 | 只看该作者

变量有作用域(生命周期)的

返回一个指向局部变量的指针,当然失败.

在一个函数中定义的变量,在离开这个函数后,已经不存在了,你又怎么能得到它的指针(即使有那么一个指针值,无疑也是一个毫无意义的指针,你根本不知道它指向的什么东西)

使用特权

评论回复
地板
wjy1107| | 2007-9-18 16:33 | 只看该作者

看看全局变量与局部变量的区别吧!

使用特权

评论回复
5
zhh124|  楼主 | 2007-9-19 09:29 | 只看该作者

那么说只能返回全局

嗯,明白~~
要是用全局变量的话,直接改写其中得内容就得了吧,不必要返回什么.
那么返回结构体指针还有什么用途?

fopen这类函数得返回值是FILE * 类型,也是结构体指针,这跟我得例子有什么区别,吗?

使用特权

评论回复
6
lenglx| | 2007-9-19 11:01 | 只看该作者

有区别:

fopen 会在heap中配置一块内存,返回的FILE * 是在heap中的,
之后你调用fclose()的时候,会释放那块内存.

你可以类似fopen()那么做.
struct    test *    func1(void)
{
    struct    test   p = malloc(sizeof(test));
    p->a = 11;
    p->b = 12;
    return   p;
}

void foo()
{
   test * p = func1();
   //...
   free(p);
}

不过这么做可不怎么安全,通常一不小心,就会发生内存泄漏.

使用特权

评论回复
7
zhh124|  楼主 | 2007-9-19 19:29 | 只看该作者

呵呵谢谢lenglx~~

呵呵谢谢lenglx,原来是这样,长知识了~~

使用特权

评论回复
8
yongzai| | 2011-5-9 11:59 | 只看该作者
看不懂啊

使用特权

评论回复
9
delin17| | 2011-5-9 13:05 | 只看该作者
6楼那样做有风险,如果使用后不记得释放,就会有内存泄漏.

楼主的问题在于局部变量,在使用完之后会释放掉, 该位置的内存会被其它函数占用.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

82

帖子

0

粉丝