C 内存使用不足是否会导致内存泄漏?

C 内存使用不足是否会导致内存泄漏?,c,memory-leaks,strncpy,C,Memory Leaks,Strncpy,strncpy()在将较少的数据复制到较大(编译时分配的)缓冲区时是否会导致内存泄漏?换句话说,内存利用率不足可以称为内存泄漏吗 下面是我的代码 #define uk "ln" int main() { char buffer[32]; strncpy(buffer,uk,sizeof(buffer));// IS it memory leak free? // uk macro has 3 byte of si

strncpy()
在将较少的数据复制到较大(编译时分配的)缓冲区时是否会导致内存泄漏?换句话说,内存利用率不足可以称为内存泄漏吗

下面是我的代码

#define uk "ln"

int main()

{
  char buffer[32];
  strncpy(buffer,uk,sizeof(buffer));// IS it memory leak free?
                                    // uk macro has 3 byte of size to
                                    // hold the string but here the
                                    // Attemp of 32 byte is made to copy
                                    // from uk macro to buffer?
}  
上述代码中是否存在内存泄漏或错误

内存泄漏?

,没有内存泄漏。句号

如果你不自己(动态地)分配内存,你也不需要释放它。编译器在编译时分配的所有内存,编译器将负责释放这些内存。我们现在可以玩了

错误?


,您没有包括
string.h
,它包含
strncpy()

的转发声明,因为
缓冲区
是一个自动变量,所以没有内存泄漏。它在退出
main()

时不再存在,实际上这两条语句

char buffer[32];
strncpy(buffer,uk,sizeof(buffer));
完全等同于以下声明

char buffer[32] = "ln";
这是一个有效的声明,没有bug或内存泄漏。:)

在这两种情况下,
buffer
中未通过字符串文字的字符(或通过复制其字符)初始化的所有元素均为零初始化

来自C标准(7.23.2.4 strncpy函数)

3如果s2指向的数组是短于n的字符串 字符,null字符追加到数组中的副本 由s1指向,直到总共写入n个字符。

一般来说,写作更为正确

char buffer[32];

strncpy(buffer,uk,sizeof(buffer));
buffer[sizeof( buffer )-1] = '\0';
那就是你的原始代码是不安全的


当然,C++中的标题“代码> >代码>必须包含在C或<代码> <代码>中,但我认为您只是忘记了为演示示例做这件事。):

这是一个代码审查请求而不是一个问题。你应该重新措辞以避免被否决。@ereOn我已经尽力了。请验证正确性。
strncpy
的问题在于源代码不短于目标代码。在这种情况下,复制的字符串不会以NUL结尾,因此使用复制可能导致缓冲区溢出。调用strncpy的代码应该显式为null终止副本。为True,没有泄漏,但您在缓冲区[]@wcochran中得到了“ln\0”。但这里的背景是什么?不管怎么说,没有泄漏。只是一个旁注——使用
strncpy
而不是
strcpy
(或简单初始化
=“ln”
)似乎很奇怪。编写(strncpy(buffer,uk,sizeof(buffer))是一种好的做法吗;我很困惑,为什么不在可以的时候保存堆栈内存。我确实同意编译器将释放堆栈内存,但为什么不注意何时可以保存堆栈内存,因为堆栈内存也是有限的?@user4950013您在声明缓冲区时已经分配了内存。函数strncpy与内存分配或重新分配没有任何共同之处