当我们将较少数量的数据复制到较大的(编译时分配的)缓冲区时,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?
}
以上代码中是否有内存泄漏或错误?
答案 0 :(得分:7)
内存泄漏?
否,没有内存泄漏。周期。
如果您不自行分配内存(动态),则无需免费。编译器在编译时分配的所有内存,编译器都会注意释放那些内存。我们现在可以玩得开心。
<强> 错误? 强>
是,您未包含string.h
,其中包含strncpy()
的转发声明。
答案 1 :(得分:5)
实际上这两个陈述
double precision
完全等同于以下声明
char buffer[32];
strncpy(buffer,uk,sizeof(buffer));
这是一个有效的声明,没有错误或内存泄漏。:)
在这两种情况下,char buffer[32] = "ln";
的所有未被字符串文字的字符(或通过复制其字符)初始化的元素都被初始化为零。
来自C标准(7.23.2.4 strncpy函数)
3如果s2指向的数组是一个短于n的字符串 字符,空字符将附加到数组中的副本 由s1指出,直到写完所有的n个字符。
一般来说,编写
更为正确buffer
这是您的原始代码不安全。
当然,C中的标题char buffer[32];
strncpy(buffer,uk,sizeof(buffer));
buffer[sizeof( buffer )-1] = '\0';
或C ++中的<string.h>
必须包括在内,但我认为你只是忘了为演示示例做到这一点。:)。
答案 2 :(得分:4)
没有内存泄漏,因为buffer
是一个自动变量。它在退出main()
后不再存在。