在遗留C代码中,我有一个指针基本上是一个大小等于枚举器之一的数组,它在本地范围内是静态的。但现在我必须删除该枚举,现在这个静态本地数组给出了错误。我可以将该数组转换为普通指针,然后动态分配它,但我不知道该怎么做。下面是我从现有代码库中简化的示例代码。
enum
{
E1,
E2,
EOL
};
void func
{
//static int array[EOL]; //-> that how it was earlier
static int *array = (int*)malloc(sizeof(int)*EOL); //Will this allocated memory only once
//or on every invokation.
free(array);//will it free the memory more than once?
}
现在我可以将数组指针移动到全局范围,然后在main中分配并在atexit函数中释放它,但我想保持最小变化,因为我不确定它在共享项目中会产生什么影响?
由于
答案 0 :(得分:2)
malloc只会出现一次。
1)您可以使用静态布尔值来告诉您数组变量中的指针是否可以自由。
2)您可以释放指针,然后将其设置为NULL。下一次自由行动将无所作为。
答案 1 :(得分:0)
如果要保持最小变化,则只需在此静态变量之前移动函数体内的枚举定义。或者你甚至可以使用一个未命名的枚举和一个枚举器来表示数组的大小。
我不理解您尝试将数组替换为动态分配的数组。
此外,目前C允许使用可变长度数组。所以你可以定义函数,使它有一个参数来指定本地(非静态)数组的大小。
答案 2 :(得分:0)
如果使用C,则无法使用非常量的东西初始化静态变量。
如果您使用的是C ++,那么静态指针只会获得一次分配给它的内存指针。
答案 3 :(得分:0)
我刚刚使用一个函数解决了这个问题,该函数基本上是收集分配给上面的本地静态指针的所有内存,然后其他函数在最后使用atexit函数注册时释放它们。
struct node
{
node *next;
void *content;
};
node* head = NULL, tail =NULL;
void addToList(void* ptr)
{
struct node* p = (struct node*)malloc(sizeof(struct node));
p->next = NULL;
p->conent = ptr;
tail->next = p;
tail = p;
return;
}
void freeList()
{
struct node* p = NULL, p1 = NULL;
for(p = head; p != NULL; p = p->next)
{
free(p1);
free(p->content);
p1 = p;
}
head = tail = NULL;
return;
}
/*
*/
void func
{
//static int array[EOL]; //-> that how it was earlier
static int *array = (int*)malloc(sizeof(int)*EOL); //Will this allocated memory only once
addToList(array); //or on every invokation.
free(array);//will it free the memory more than once?
}
正如您在代码上面看到的那样,链接列表是在单独的.c文件中创建的,并且使用.map方法head,tail和node将不会暴露给外部世界,只有addToList和freeList是可见的。在执行malloc之后的每个地方,我都在调用addToList,然后freeList将释放内存。
由于