全局变量和函数封装

时间:2016-06-26 08:59:54

标签: c global-variables

我有一个C程序,它在main()中动态分配内存,并将其地址提供给main()本地的指针变量。我更喜欢在函数中分配内存并使main()尽可能简单。为此,我必须制作指向已分配内存全局的指针变量。然而,函数的封装将因为使用全局变量而丢失,因此不能在以后的其他程序中重用。是否有关于此的最佳做法惯例?我应该维护简单的main()函数,其中逻辑最小,或者自包含的函数不依赖于全局变量。还有其他原因不使用全局变量吗?

2 个答案:

答案 0 :(得分:1)

您可以将指针变量返回给main而不是将它们设为全局变量。请记住,从堆中分配的内存仅在释放时超出范围,因此它们与函数内声明的局部变量不同,因此将它们返回给调用者是安全的,然后可以使用它然后 free记忆

重要的是,从堆中分配的内存只有在返回到免费商店时才会超出范围,而不一定在函数返回时。通过返回指向该内存位置的指针,您可以按照自己的意愿重复使用它,但始终记得释放它

我希望这很有帮助。

答案 1 :(得分:0)

这很大程度上取决于你在做什么。

如果你只是在几个函数中使用malloc很多次并且确信你可以确保每个指针在适当的时候被释放,那么只需从函数返回指针。

更优雅的解决方案可能是将句柄传递给函数。因此,在main中声明指针并通过引用将其作为参数传递,并使函数改变它。

如果你有重复调用的函数并使用malloc并且那些指针必须不规律地释放某种表,其中包含所有地址然后返回数字id而不是指针可以是优雅的但是查找垃圾收集并考虑一下如果是这种情况,你自己的分配器。这可能会变得更复杂,并且有很多关于这种事情的理论。

尽管我认为,通过把手最有可能最适合你。这是一个例子。

void test ( char* &p ){
    p = (char *) malloc (10);
    if ( p == NULL ) exit(1);
}
void main () {
    char * p;
    test(p);
    free(p);
}