当我们将较少数量的数据复制到较大的(分配的编译时间(缓冲区时,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?
}
以上代码中是否存在内存泄漏或错误?
内存泄漏
否,没有内存泄漏。时期
如果您自己不分配内存(动态(,也不需要释放。编译器在编译时分配的所有内存,编译器将负责释放这些内存。我们现在可以玩得开心了。
Bug
是,您没有包括string.h
,它包含strncpy()
的正向声明。
事实上,这两条语句
char buffer[32];
strncpy(buffer,uk,sizeof(buffer));
完全等同于以下声明
char buffer[32] = "ln";
这是一个有效的声明,没有错误或内存泄漏。:(
在这两种情况下,未通过字符串文字的字符(或通过复制其字符(初始化的buffer
的所有元素都是零初始化的。
来自C标准(7.23.2.4 strncpy函数(
3如果s2指向的数组是短于n的字符串字符,空字符将附加到数组中的副本由s1指向,直到总共写入了n个字符
一般来说,写会更正确
char buffer[32];
strncpy(buffer,uk,sizeof(buffer));
buffer[sizeof( buffer )-1] = ' ';
这就是你的原始代码是不安全的。
当然,C中的头<string.h>
或C++中的<cstring>
必须包含在内,但我认为您只是忘记了为示例执行此操作。:(。
没有内存泄漏,因为buffer
是一个自动变量。它在退出main()
时停止存在。