我正在尝试使用'\ 0'来截断字符串:
char str[] = "hello";
str[2] = '\0';
执行此操作后,字符串长度将减少为2,因为检查字符串长度的函数终止于'\0'
。我很好奇为"lo"
保留的内存空间。这会导致内存泄漏吗?
答案 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;
此代码段中是否存在内存泄漏? - 不,没有。