未充分利用的内存会导致内存泄漏吗?

时间:2015-05-28 16:42:39

标签: 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?
}  

以上代码中是否有内存泄漏或错误?

3 个答案:

答案 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()后不再存在。