免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5032 | 回复: 7

关于struct中的内存分配 [复制链接]

论坛徽章:
0
发表于 2009-05-25 15:57 |显示全部楼层
本人是初手, 看一些源程序,有些关于struct中的内存分配问题,不明白:
pg_dump.h
typedef struct SimpleStringListCell
{
    struct SimpleStringListCell *next;
    char        val[1];            /* VARIABLE LENGTH FIELD */
} SimpleStringListCell;

typedef struct SimpleStringList
{
    SimpleStringListCell *head;
    SimpleStringListCell *tail;
} SimpleStringList;


pg_dump.c
#include "pg_dump.h"

static SimpleStringList schema_include_patterns = {NULL, NULL};


void
simple_string_list_append(SimpleStringList *list, const char *val)
{
    SimpleStringListCell *cell;

    /* this calculation correctly accounts for the null trailing byte */

   // 以下语句有点费解
    cell = (SimpleStringListCell *)
        pg_malloc(sizeof(SimpleStringListCell) + strlen(val));


    cell->next = NULL;
    strcpy(cell->val, val);

    if (list->tail)
        list->tail->next = cell;
    else
        list->head = cell;
    list->tail = cell;
}


int
main(int argc, char **argv)
{
.....
  
  simple_string_list_append(&schema_include_patterns, "abcdefg");
....


}



有2个问题:

1. 结构SimpleStringListCell有一成员 char var[1]竟能存储不定长的字符,即对它的内存分配有点费解

cell = (SimpleStringListCell *)
        pg_malloc(sizeof(SimpleStringListCell) + strlen(val));


2. 在struct中用malloc分配了内存, 程序结束需要手工释放内存吗? 我在他的程序里没看到free语句

请多多指教,谢谢.

[ 本帖最后由 trainee 于 2009-5-25 16:02 编辑 ]

论坛徽章:
0
发表于 2009-05-25 16:18 |显示全部楼层
char var[1] 只存储了地址而已.
还有人用var[0]呢.
在这里可以认为完全等价于char *var..

论坛徽章:
0
发表于 2009-05-25 16:19 |显示全部楼层
pg_malloc应该对malloc进行了封装了,看看实现就知道了啊.

论坛徽章:
0
发表于 2009-05-25 16:21 |显示全部楼层
1. 这种方式是一个trick, 建议不要使用. 这种方式并不是val[1]保存了不的字符, 而是把val变量当做一个指针. 这种方式只是避免再次调用malloc, 一次分配struct空间, 一次分配val(如果把val定义为一个指针的话)空间. 其实并没有减少工作量, 还容易出错. 可以为结构体的实例化写一个创建函数和释放函数.

2. 使用malloc分配的内存必须手工调用free释放, 除非进程结束.

论坛徽章:
0
发表于 2009-05-25 16:36 |显示全部楼层
其实也挺好理解,就是把数组名当作指针来用

val存储内容的大小是后面分配时指定的

论坛徽章:
0
发表于 2009-05-25 18:05 |显示全部楼层

回复 #1 trainee 的帖子

struct内存分配 只是给他分配的内存地址...

论坛徽章:
1
寅虎
日期:2014-11-30 21:25:54
发表于 2009-05-25 20:30 |显示全部楼层
原帖由 yeehya 于 2009-5-25 16:18 发表
char var[1] 只存储了地址而已.
还有人用var[0]呢.
在这里可以认为完全等价于char *var..


如果认为等价就理解错了 数组名是直接引用 指针是间接引用 用数组可以起到内存连续的作用

论坛徽章:
0
发表于 2009-05-25 20:32 |显示全部楼层
去看C99明目张胆的支持变长struct吧,不要用这种tips,而应该使用ANSI/ISO C99标准的语法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP