Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何释放分配给本地静态指针的内存_C - Fatal编程技术网

C 如何释放分配给本地静态指针的内存

C 如何释放分配给本地静态指针的内存,c,C,在遗留的C代码中,我有一个指针,基本上是一个数组,大小等于枚举数的一个,它在局部范围内是静态的。但是现在我必须删除这个枚举,现在这个静态局部数组给出了一个错误。我可以将该数组转换为普通指针,然后动态地分配它,但我不知道如何做到这一点。下面是我从现有代码库中简化的示例代码 enum { E1, E2, EOL }; void func { //static int array[EOL]; //-> that how it was earlier static int *array = (i

在遗留的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函数中释放它,但我希望保持最小的更改,因为我不确定它在共享项目中会产生什么影响


谢谢,malloc只会发生一次

1) 您可以使用静态布尔值来知道数组变量中的指针是否可用


2) 您可以释放指针,然后将其设置为NULL。下一次使用free将不起任何作用。

如果希望使更改保持最小,只需将枚举定义移到函数体中此静态变量之前即可。或者,您甚至可以将一个未命名的枚举与一个枚举数一起用于数组的大小

我不理解您试图用数组替换动态分配的数组


此外,目前C允许使用可变长度数组。因此,您可以这样定义函数,即它有一个参数来指定本地(非静态)数组的大小。

如果使用C,则不能使用非常量初始化静态变量


如果你使用C++,那么静态指针只会得到一次分配给它的内存指针。

< P>我用一个函数解决了这个问题,它基本上是收集所有分配给本地静态指针的内存,就像其他函数一样,在使用ATSutualStutabor。
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会释放内存


谢谢,这个解决方案很大程度上取决于你是在编程C或C++。请选择一种您想要解决方案的语言。这在C语言中甚至不起作用。关于
atexit
的讨论表明存在更大的问题。内存应该在最后一次调用func后释放,而不是在第一次调用后释放。我可能会泄露记忆。无论如何,操作系统将在退出后清理它。从atexit`调用
free()
是毫无意义的。free(NULL)与delete NULL不同,不能保证无害。什么意思,“malloc只发生一次”?程序将无法编译@迈克尔:是的<代码>自由(空)被指定为不执行任何操作。C997.20.3.2:2.@PascalCuoq-我的错误。这些天我没怎么做C,我记不清了。