我有一个结构体
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
问题是如果我选择一次释放特定元素,那么如果我选择一次释放所有元素,那么正确的方法是什么以及我需要什么
答案 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