'\ 0'会导致内存泄漏吗?

时间:2015-02-12 09:53:59

标签: c

我正在尝试使用'\ 0'来截断字符串:

char str[] = "hello";
str[2] = '\0';

执行此操作后,字符串长度将减少为2,因为检查字符串长度的函数终止于'\0'。我很好奇为"lo"保留的内存空间。这会导致内存泄漏吗?

3 个答案:

答案 0 :(得分:2)

您的代码段需要考虑2个内存区域:

字符串文字"hello"的区域,由6个字节组成('h''e''l''l''o''\0')和变量str的区域,也由6个字节组成(字符串文字的副本)。

这些内存区域都不会移动,更改大小或以任何方式进行更改,因此内存泄漏的可能性不大。

您可以更改为str保留的内存区域的内容;您无法更改为字符串文字保留的内存区域的内容str[2]设置为'\0'即可。

答案 1 :(得分:1)

有两种可能性:char str[] = "hello";位于函数内部,或者它位于函数之外。

如果它在函数内部,那么数组将在堆栈上分配,因此只要函数返回,堆栈就会被回收,所以不会造成任何损害。

如果它在函数之外,则数组将在静态数据段中分配。当你通过在它的中间放置一个零来截断它时,内存仍然存在,你可以稍后用' l'来替换零。你会得到"你好"背部。也没有伤害。

我们谈论内存泄漏的唯一场景是我们动态分配内存,例如使用malloc()。如果您使用p = malloc( 1 );分配内存,然后忘记指向它的指针(例如,使用p = NULL;或使用其他p = malloc( 1 );而不先执行free( p );),那么您已经介绍了一个小的,微小的内存泄漏。

答案 2 :(得分:1)

不,这里没有内存泄漏。

关键是你已经声明并初始化了一个数组的字符。你可以做两种方式,实际上是相同的:

第一种方式:

char str[] = {'h', 'e', 'l', 'l', 'o', '\0'};

这里编译器知道你想要一个字符数组,它通过逐个元素初始化来计算数组长度和内容。所以,你有一个包含6个字符的数组。

第二种方式:

char str[] = "hello";

这里编译器再一次知道你想要一个字符数组。字符数组,这是一种特殊情况,可以用字符串文字初始化。它的长度是5个打印字符加一个字符串终止NUL。所以你有一个包含6个字符的数组。

更改此数组的任何特定元素不会导致内存泄漏,因为您仍然可以使用str[i]访问任何数组元素。你必须确保,你不会使用i摆脱数组范围。

尝试与此比较:

int arr_int[] = {10, 20, 30, 40, 50};
arr_int[2] = 0; 

此代码段中是否存在内存泄漏? - 不,没有。