+ -
当前位置:首页 → 问答吧 → 求助!!!释放结构体的指针成员

求助!!!释放结构体的指针成员

时间:2011-12-15

来源:互联网

有如下结构体定义
C/C++ code

struct node {
    char *time;
    char *protocol;
    char *port;
    char *ip;
    char *interface;
    char *macaddr;
    struct node *next;
};
typedef struct node *Node;
typedef Node LIST;
int node_size = sizeof(struct node) - sizeof(void *);


现在我用一个接口去填充这个结构体,输入是对应结构体成员的字符串,接口实现如下:
C/C++ code

int get_next_field(const char *ostr, char symbol1, char symbol2, char *sfield)
{
    if (!ostr || !sfield) return -1;
    
    char *pos;
    
    if (!(pos = strchr(ostr, symbol1)) && !(pos = strchr(ostr, symbol2)))
        return -1;
    memcpy(sfield, ostr, pos - ostr);
    
    return pos - ostr + 1;
}

int fill_in_node(const char *ostr, char divflag, char endflag, Node P)
{
    int curpos, parsed, cur_offset;
    char *ori_pos;

    curpos = parsed = cur_offset = 0;
    ori_pos = (char *)P;
    
    for(; cur_offset < node_size; cur_offset += sizeof(char *)) {
        char *tmp;
        
        if (!(tmp = (char *)malloc(32)))
            return -1;
        memset(tmp, 0, 32);
        parsed = get_next_field(ostr + curpos, divflag, endflag, tmp);
        memcpy(ori_pos + cur_offset, &tmp, sizeof(char *));
        curpos += parsed;
    }
    return curpos;
}

到这步都没有问题,当我要释放结构体中这些指针成员的时候free()出错了。释放代码如下
C/C++ code

void free_node(Node p)
{
    int offset;
    char *ori_pos;
    
    ori_pos = (char *)p;
    
    for (offset = 0; offset < node_size; offset += sizeof(char *)) {
        free(ori_pos + offset);
    }
}

void free_list(LIST L)
{
    Node p, q;
    
    p = L;
    
    while (p) {
        q = p->next;
        free_node(p);
        p = q;
    }
}

我是个新手,高手们帮我看看错在哪里啊?谢谢了

作者: qiuhui00   发布时间: 2011-12-15

补充:出错的地方是在free_node()

作者: qiuhui00   发布时间: 2011-12-15

[code=C/C++][/code]void free_node(Node p)
{
  int offset;
  char *ori_pos;
   
  ori_pos = (char *)p;
   
  for (offset = 0; offset < node_size; offset += sizeof(char *)) {
  free(ori_pos + offset);//当offset=0时就把你的node给整个释放了
  }
}

你要释放结构体中的指针就指针指向他一个一个的释放如free(p->time);弄个for循环容易出错不说,看起来还不舒服

作者: WYJXHL97   发布时间: 2011-12-15

热门下载

更多