我需要释放固定长度的字符数组吗?

Do I need to free char array of fixed length?

据我对其他 SO 问题的回答可以看出,我不需要像下面这样释放定长数组:

unsigned char buffer[16];

但通常调用mallocmemcpy等时都需要释放内存

我的问题是:在以下情况下我是否需要调用 free

unsigned char buffer[16];
memcpy(buffer, source, 16);
...
free(buffer); // needed?

更准确地说:是根据变量的声明还是初始化来决定使用堆还是栈?

您只能 free()malloc()/calloc()/realloc() 返回的指针,传递任何未由这些函数之一返回的指针是未定义的行为。

在你分配数组的情况下

unsigned char buffer[16];

在函数内部,当数组超出作用域时,数组将自动自动释放,即当函数returns.

数组实际上只在声明它的范围内有效

if (condition != 0)
 {
    unsigned char buffer[16];
 }
/* here it was already deallocated */

上面的例子是一个很好的例子,它证明了用 gcc 启用 -Wshadow 是合理的。

不,您已经在堆栈上分配了对象,因此不需要释放。如果您使用 malloc,您将在堆上分配内存,然后您必须释放它。

如果一个数组在栈上,你不需要释放它;当栈帧弹出时,它会自动被回收。

如果数组在堆上(使用 malloc 或类似函数分配),则需要显式释放。否则你有内存泄漏。