use*_*013 -5 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 size to
// hold the string but here the
// Attemp of 32 byte is made to copy
// from uk macro to buffer?
}
Run Code Online (Sandbox Code Playgroud)
上面的代码中是否有内存泄漏或错误?
内存泄漏?
不,没有内存泄漏.期.
如果您不自己(动态)分配内存,则也不需要释放内存.编译器在编译时分配的所有内存,编译器都会注意释放那些内存.我们现在可以玩得开心.
错误?
是的,你没有包含string.h哪个包含前向声明strncpy().
实际上这两个陈述
char buffer[32];
strncpy(buffer,uk,sizeof(buffer));
Run Code Online (Sandbox Code Playgroud)
完全等同于以下声明
char buffer[32] = "ln";
Run Code Online (Sandbox Code Playgroud)
这是一个有效的声明,没有错误或内存泄漏.:)
在这两种情况下buffer,字符串文字的字符(或通过复制其字符)未初始化的所有元素都是零初始化.
从C标准(7.23.2.4 strncpy函数)
3如果s2指向的数组是一个短于n个字符的字符串,则将空字符附加到s1指向的数组中的副本,直到写入所有n个字符.
一般来说,编写更准确
char buffer[32];
strncpy(buffer,uk,sizeof(buffer));
buffer[sizeof( buffer )-1] = '\0';
Run Code Online (Sandbox Code Playgroud)
那是你的原始代码是不安全的.
当然,必须包含<string.h>C或<cstring>C++中的标题,但我认为你只是忘了为演示示例做这个.:).
| 归档时间: |
|
| 查看次数: |
371 次 |
| 最近记录: |