c函数:重新初始化静态数组还是每次调用都声明新的?

c函数:重新初始化静态数组还是每次调用都声明新的?,c,arrays,static,C,Arrays,Static,我想知道如果我想在一个函数中使用由n个无符号字符元素组成的零初始化数组,最好的方法是什么。n约为600 a) 在每次函数调用时新声明数组: unsigned char buffer[n] = {0}; static unsigned char buffer[n] = {0}; memset (buffer, 0, n); b) 声明为静态,但memset每个函数调用: unsigned char buffer[n] = {0}; static unsigned char buffer[n]

我想知道如果我想在一个函数中使用由n个无符号字符元素组成的零初始化数组,最好的方法是什么。n约为600

a) 在每次函数调用时新声明数组:

unsigned char buffer[n] = {0};
static unsigned char buffer[n] = {0};
memset (buffer, 0, n);
b) 声明为静态,但memset每个函数调用:

unsigned char buffer[n] = {0};
static unsigned char buffer[n] = {0};
memset (buffer, 0, n);
我希望(a)中的memset和初始化成本相同。但是对于(a),我需要在每次函数调用时分配内存,并在离开函数时释放内存。这在(b)中不会发生,因为数组被声明为静态的。
我说得对吗

保持它
静态
意味着它在启动时初始化为零,这在这里对您没有好处,因为您在运行时将它设置为零。如果特定于系统的静态初始化是在运行时执行的,这意味着您的程序启动速度较慢

另外,
静态
变量不是线程安全的,这可能是问题,也可能不是问题


在堆栈分配的情况下,需要时间的不是分配,而是零输出。因此,如果您关心性能,最好的解决方案是根本不将其初始化为零,而是确保算法写入数组的每个字节。我不知道这里的算法,但“我必须有一个大小为600的全零局部数组”是一个奇怪的要求。

考虑到所有现代编译器都在堆栈上放置局部变量,包括数组,“分配”这样的内存只是编译器适当地调整堆栈和帧指针寄存器。这是我们无论如何必须做的。没有“真正的”分配(比如调用
malloc
或类似的方法)。我不希望[在性能上]有任何差异。分配和初始化一个600的自动数组可能会让编译器也插入一个
memset
调用来初始化它(或者它可以插入机器指令)。使用静态数组的方法的缺点是它不会是线程安全的。甚至递归也不可能。因此,如果你不是在为最后一微秒而战,那就使用另一种方法。“如果你在战斗,那就测试一下。”说书人说,“好吧,更好的说法应该是称之为“非再入者”。那总是很危险的。我有一种情况(几年前),我在信号处理程序中执行printf()。它偶尔会崩溃,因为有时在malloc()调用期间调用了信号处理程序(在这种情况下,调试器没有帮助)。因此,我了解到,使函数重新进入是一组好函数中的一员ideas@Ronald-我更进一步说,这是一个杰出的成员说,集。好的方面。该数组用于存储通过UDP接收的数据。数据的长度可以在13到525个字符之间变化。600只是一个数字。如果我没弄错的话,下面是一种更好的方法:通过UDP接收数据并将其直接写入阵列。然后将剩余的字节归零。我试试这个。谢谢你inspiration@Stefatronik或者只使用一个size变量来跟踪实际使用的数组的数量。