GCC 4.4.4的C89分配和结构的免费对象
我在channel.h中文件
typedef struct channel_tag channel_t;
channel_t* open_channel(size_t channel_id);
void close_channel(channel_t *channel);
而在我channel.c文件下面的代码
#include "channel.h"
struct channel_tag {
size_t channel_id;
};
channel_t* open_channel(size_t channel_id)
{
channel_t *channel = malloc(sizeof *channel);
if(channel == NULL) {
fprintf(stderr, "Cannot allocate memory\n");
return NULL;
}
channel->channel_id = channel_id;
printf("Channel [ %zu ] has been created\n", channel->channel_id);
return channel;
}
void close_channel(channel_t *channel)
{
printf("Channel [ %zu ] resources has been released\n", channel->channel_id);
free(channel);
}
问题出在我的main.c文件上。在这里我有一个for循环,它创建5个通道对象并为它们分配内存。但是,如果我想在我的程序中稍后释放它们,我不知道如何才能得到它们的参考。这只是我正在测试的5个。但后来它可能是高达300
int main(void)
{
size_t i = 0;
channel_t *channel = NULL;
for(i = 0; i < 4; i++) {
channel = open_channel(i);
if(channel == NULL) {
fprintf(stderr, "Cannot create channel [ %zu ]\n", i);
}
}
/* Do some stuff with the channels and now free them before the program exists.
However, I need to loop and pass all of them, not just one */
for(i = 0; i < 4; i++) {
close_channel(channel);
}
return 0;
}
的任何建议非常感谢,
第一行应该是'channel_t ** ...',对吗? – 2010-11-16 17:02:58
是的,谢谢@尼古拉。太多的C++。 – 2010-11-16 17:03:47
'memset()'在这种情况下不需要:'channel [i]'在被测试之前被分配到任何地方。如果你想检查'malloc()'的结果,你应该在'channel'上调用'memset()'之前这样做。 – Sjoerd 2010-11-17 09:07:20