例如,假设我有一个名为char journal_name[25]
的缓冲区,我用它来存储日志名称。现在假设在代码中稍后几行我想将某人的名字存储到缓冲区中。我应该char person_name[25]
还是仅重复使用journal_name[25]
?
问题在于,每个阅读代码的人(以及几周后的我也必须了解journal_name
现在实际上是person_name
。
但是反驳的论点是拥有两个缓冲区会增加空间使用量。所以最好使用一个。
您如何看待这个问题?
谢谢,Boda Cydo。
答案 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个字节是个问题,但是你可以使用malloc
和free
然后你只需要额外的4-8个字节对于指针。
但是,正如其他人提到的那样,可读性很重要,您可能希望分解您的函数,以便在函数中使用这两个缓冲区来实际提供更多关于其用途的指示。
<强>更新强>
现在,我有一个名为buffer
的缓冲区,我将用它来读取文件,例如,然后我将使用传递的函数指针来解析结果,以便函数读取该文件,并适当地处理它,以便缓冲区没有填写,然后我必须记住它不应该被覆盖。
所以,当从套接字或文件中读取时,重用缓冲区可能很有用,但是你想要本地化这个缓冲区的使用,否则你可能会遇到竞争条件。