LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 844|回复: 7

有关函数返回struct *的疑问

[复制链接]
发表于 2003-8-30 14:08:00 | 显示全部楼层 |阅读模式

struct lconv *localeconv(void);
这种函数,它所返回的指针所指空间应该是在函数中动态分配的吧?那需要free吗?
发表于 2003-8-30 14:12:01 | 显示全部楼层

回复: 有关函数返回struct *的疑问

可以在函数内声明static struct 对象
不过不推荐。




最初由 pupilzeng 发表

struct lconv *localeconv(void);
这种函数,它所返回的指针所指空间应该是在函数中动态分配的吧?那需要free吗?
 楼主| 发表于 2003-8-30 14:25:32 | 显示全部楼层
这是个库函数呀,不是我定义的,我想知道它里面是怎么实现的。
类似的还有struct tm* localtime(const time_t *timer);
最重要的是它的空间需不需要释放。
发表于 2003-8-30 15:33:37 | 显示全部楼层
the space is allocated in steap ,you should free it
 楼主| 发表于 2003-8-30 17:49:48 | 显示全部楼层
but in this example,it doesn't be released.
http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.6.html
Read the example at the bottom of the page.
 楼主| 发表于 2003-8-30 23:25:34 | 显示全部楼层

似乎是使用static struct

我写了如下的代码测试:

  1. #include<iostream>
  2. using namespace std;
  3.       
  4. int
  5. main()
  6. {
  7.            struct lconv * ptr = NULL;
  8.            while (ptr = localeconv());
  9.            cout << "heap was exhausted!" << endl;
  10. }
复制代码


然后我使用gdb调试,发现ptr的值一直没变,所以它不应该是在堆中动态分配的,而应该是在全局区中分配的。
发表于 2003-8-31 00:21:31 | 显示全部楼层
它的联机帮助中会有说明吧
最好还是找找看

因为可能有的是使用静态变量实现  如inet_ntoa
有的可能是使用动态分配内存实现  
并且内存的分配也有c与c++区别 (malloc new 释放时使用操作符不一样)
 楼主| 发表于 2003-8-31 00:52:37 | 显示全部楼层
localeconv的联机文档中没有说明
localetime()中说明是静态分配的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表