释放结构指针的特定元素 - C

时间:2021-03-10 08:26:48

标签: c

我有一个结构体

    struct packets {
        int tcp_source;
        int tcp_dest;
        char *ip_source;
        char *ip_dest;
        int seq;
        ...
    } *pkts;

当我完成使用特定的 malloc(由 while 指向)时,我在 while 循环和 pkts 循环内使用 (ptks+index) 分配空间我需要像这样释放它:

    while (i++ < n - 1) {
        (pkts+i)=(struct packets *) malloc(sizeof (struct packets))
        //shared `i` and signal sending thread to send packet
        ...
    }           
    // Now I need to free `(pkts+i)` like
    while (i < 10)
        free((pkts + i)); //Not working
          //OR
        free(pkts[i]); / Not working either -- in both cases error zsh: abort

问题是如果我选择一次释放特定元素,那么如果我选择一次释放所有元素,那么正确的方法是什么以及我需要什么

1 个答案:

答案 0 :(得分:3)

您需要使用 pkts 作为指向 struct packets 的指针数组。

struct packets **pkts = malloc(N * sizeof *pkts);
...
for (int i = 0; i < N; ++i) {
  // setting  i-th element
  pkts[i]=malloc(sizeof pkts[i]);
  // accessing i-th element
  pkts[i]-> ...
}
for (int i = 0; i < N; ++i) {
   // freeing individual element
   free(pkts[i]);
   pkts[i] = NULL; // avoid accidental accessing or re-freeing 
}
// freeing whole array of pointers
free(pkts);

正如评论中提到的,您可能不需要单独分配每个数据包。只需分配一组数据包即可。

struct packets *pkts = malloc(N * sizeof *pkts);
...
free(pkts);

如果您使用符合 C99 的编译器并且您对数据包数量有合理的限制,请使用 VLA。

struct packets pkts[N]; // that's all