在C中为各种事物重复使用相同的缓冲区名称是一种常见做法吗?

时间:2010-08-15 20:32:34

标签: c buffer naming

例如,假设我有一个名为char journal_name[25]的缓冲区,我用它来存储日志名称。现在假设在代码中稍后几行我想将某人的名字存储到缓冲区中。我应该char person_name[25]还是仅重复使用journal_name[25]

问题在于,每个阅读代码的人(以及几周后的我也必须了解journal_name现在实际上是person_name

但是反驳的论点是拥有两个缓冲区会增加空间使用量。所以最好使用一个。

您如何看待这个问题?

谢谢,Boda Cydo。

7 个答案:

答案 0 :(得分:16)

以C方式解决这个问题的方法,如果你真的不想浪费内存,就是使用块来调整缓冲区的范围:

int main()
{
  {
    char journal_name[26];
    // use journal name
  }
  {
    char person_name[26];
    // use person name 
  }
}

编译器将为两者重用相同的内存位置,同时为您提供一个完全清晰的名称。

作为替代方案,请将其命名为name并将其用于<。<

答案 1 :(得分:8)

有些代码在这里真正有序。但需要注意几点:

保持标识符与对象分离。称之为scratchpad或其他任何东西。此外,从它的外观来看,这个字符数组不是动态分配的。这意味着您必须分配足够大的便笺本才能重用它们。

更好的方法是让你的功能更短:理想情况下,一个功能一次只做一件事。看看你是否可以分手并仍然面对这个问题。

答案 2 :(得分:4)

作为之前(好)答案的替代方案,那么

char buffer[25];

char* journal_name = buffer;

然后再

char* person_name = buffer;

会没事吗?

答案 3 :(得分:3)

如果两个缓冲区都是自动的,为什么不使用它呢? 大多数编译器都会在重用内存时正确处理。 但是你保持可读性。

{
    char journal_name[25];
    /*
        Your code which uses journal_name..
    */
}
{
    char person_name[25];
    /*
        Your code which uses person_name...
    */
}

顺便说一句,即使您的编译器很愚蠢并且内存非常低,您也可以使用union,但为了便于阅读,请保留不同的名称。使用相同的变量是最糟糕的方式。

答案 4 :(得分:2)

请使用person_name[25]。没有人喜欢难以阅读的代码。如果你的程序在内存方面有任何改动,它就不会做太多。请以可读的方式做到。

答案 5 :(得分:2)

你应该总是(除非你非常内存紧张)在编写代码时为了可读性和可维护性而出于你在问题中提到的原因。

25个字符(除非这只是一个例子)不会“破坏银行”,但如果内存非常宝贵,您可以动态分配journal_name的存储空间,然后在您使用时将其释放在为person_name动态分配存储空间之前完成了它。虽然指向数组的指针有“开销”。

另一种方法是在数组上使用本地作用域:

void myMethod()
{
    ... some code
    {
        char journal_name[25];
        ... some more code
    }
    ... even more code
    {
        char person_name[25];
        ... yet more code
    }
}

虽然即使使用这个伪代码,该方法也会花费很长时间,并且可以从重构到不会出现此问题的子例程中受益。

答案 6 :(得分:1)

如果你担心内存,我怀疑25个字节是个问题,但是你可以使用mallocfree然后你只需要额外的4-8个字节对于指针。

但是,正如其他人提到的那样,可读性很重要,您可能希望分解您的函数,以便在函数中使用这两个缓冲区来实际提供更多关于其用途的指示。

<强>更新

现在,我有一个名为buffer的缓冲区,我将用它来读取文件,例如,然后我将使用传递的函数指针来解析结果,以便函数读取该文件,并适当地处理它,以便缓冲区没有填写,然后我必须记住它不应该被覆盖。

所以,当从套接字或文件中读取时,重用缓冲区可能很有用,但是你想要本地化这个缓冲区的使用,否则你可能会遇到竞争条件。