C 范围和内存使用 编辑:我的特定用例:

问题描述

我有一个关于作用域以及如何在 C 中处理内存的问题。示例:

int main(){
    int some,instance,variables;
    
    { // scoped block to do some work
        int more,data,just,forThisBlock;
    }
    
    // ...
}

基本上我的问题是.... 使用上述块来划分区域以实例化临时使用的数据是否有意义?在内存方面,块中分配的变量会发生什么?它们是否在块退出后取消分配,表面上在函数中进一步节省内存?我意识到适当的函数也可以达到目的,但在某些情况下,如果工作只有几行,那么添加一个函数就不那么整洁了。

编辑:我的特定用例:

许多函数返回一个 int 以显示是否发生了错误。我环顾四周时注意到,样式约定是在其作用域块的开头“堆积”变量声明。如果你有几个这样的函数用途,那么你可能会用变量来覆盖声明以存储这些返回值(或者实际上是任何仅临时使用的变量,其处理需要许多其他更“永久的” ' 变量会产生一个函数声明)。本质上,该问题的目的是确定将这些用法划定范围以尝试更清晰的外观和声明部分的后果。我意识到在某些情况下可以重用这个返回值,但这个问题的目的是为了更好地理解我的选择。

例如:

    int infoRtn;
    char *serverHost;
    ...    


    infoRtn = getaddrinfo(
            serverHost,port,&addrCriteria,&addrList
    );

    if(infoRtn != 0){
        fprintf(stderr,"%s @ %d: Failed to get address info,error returned: %d\n",__FILE__,__LINE__,infoRtn);
        exit(1);
    }
    
    ...

对比

    char *serverHost;
    ...    

    {
        int infoRtn = getaddrinfo(
                serverHost,&addrList
        );
    
        if(infoRtn != 0){
            fprintf(stderr,infoRtn);
            exit(1);
        }
    }
    
    ...

解决方法

使用上述块来划分区域以实例化临时使用的数据是否有意义?

就我个人而言,我还没有看到很多使用匿名块来做某事的用例。 函数是为此而设计的,您应该使用它,使用函数还可以让您看到您正在尝试做某事(但隐藏其实现),并且可读性更好,例如

int averagreMarks = getAvgMarks(students);

在这里,当我阅读时,我看到要求学生的平均分数。如果我想看看它的实现,我会去看看其他的我只是跳过主要逻辑(更好的可读性)

内存方面,块中分配的变量会发生什么

是的,它们被销毁了(至少在大多数 C 编译器中),因此在内存方面它可以类似于函数,但我强烈建议使用函数以获得更好的可读性和可维护性

编辑(在细节被添加到问题之后)

我提出了第三个解决方案

 {
    char *serverHost;
    validateConnection() //Add params that you want to send
    ...    

    }
    
validateConnection() {
    int infoRtn;
    infoRtn = getaddrinfo(
            serverHost,port,&addrCriteria,&addrList
    );

    if(infoRtn != 0){
        fprintf(stderr,"%s @ %d: Failed to get address info,error returned: %d\n",__FILE__,__LINE__,infoRtn);
        exit(1);
}

上述解决方案的优点是用户知道现在我们验证并继续。另外,如果您的验证逻辑被修改(例如您添加重试),您不会混淆原始功能。