C 威尔'\0';导致内存泄漏?
我正在尝试使用“\0”截断字符串:C 威尔'\0';导致内存泄漏?,c,C,我正在尝试使用“\0”截断字符串: char str[] = "hello"; str[2] = '\0'; 执行此操作后,字符串长度将减少到2,因为用于检查字符串长度的函数终止于'\0'。我很好奇为“lo”保留的内存空间。这会导致内存泄漏吗?您的代码段有两个内存区域需要考虑: 字符串文本的区域由6个字节('h','e','l','l','o','\0')组成,变量的区域也由6个字节(字符串文本的副本)组成 这两个内存区域都不会四处移动、改变大小或以任何方式进行更改,因此不存在内存泄漏的可能性
char str[] = "hello";
str[2] = '\0';
执行此操作后,字符串长度将减少到2,因为用于检查字符串长度的函数终止于
'\0'
。我很好奇为“lo”
保留的内存空间。这会导致内存泄漏吗?您的代码段有两个内存区域需要考虑:
字符串文本的区域由6个字节('h'
,'e'
,'l'
,'l'
,'o'
,'\0'
)组成,变量的区域也由6个字节(字符串文本的副本)组成
这两个内存区域都不会四处移动、改变大小或以任何方式进行更改,因此不存在内存泄漏的可能性。
您可以更改为str
保留的内存区域的内容;不能更改为字符串文字保留的内存区域的内容。将
str[2]
设置为'\0'
完全可以。您的代码段有两个内存区域需要考虑:
字符串文本的区域由6个字节('h'
,'e'
,'l'
,'l'
,'o'
,'\0'
)组成,变量的区域也由6个字节(字符串文本的副本)组成
这两个内存区域都不会四处移动、改变大小或以任何方式进行更改,因此不存在内存泄漏的可能性。
您可以更改为str
保留的内存区域的内容;不能更改为字符串文字保留的内存区域的内容。将
str[2]
设置为'\0'
完全可以。有两种可能:要么char str[]=“hello”代码>位于函数内部或函数外部
如果它在函数内部,那么数组将被分配到堆栈上,因此一旦函数返回,堆栈将被回收,因此不会造成任何伤害
如果它在函数之外,那么将在静态数据段中分配数组。当你把它放在中间的时候截断它,内存仍然在那里,然后你可以用“L”替换零,你就会得到“hello”。也没有造成伤害
我们谈论内存泄漏的唯一场景是动态分配内存,例如使用malloc()。如果使用p=malloc(1)分配内存然后忘记指向它的指针(例如,使用p=NULL;
或使用另一个p=malloc(1);
而不首先执行free(p);
),然后引入了一个非常小的内存泄漏。有两种可能性:要么char str[]=“hello”代码>位于函数内部或函数外部
如果它在函数内部,那么数组将被分配到堆栈上,因此一旦函数返回,堆栈将被回收,因此不会造成任何伤害
如果它在函数之外,那么将在静态数据段中分配数组。当你把它放在中间的时候截断它,内存仍然在那里,然后你可以用“L”替换零,你就会得到“hello”。也没有造成伤害
我们谈论内存泄漏的唯一场景是动态分配内存,例如使用malloc()。如果使用p=malloc(1)分配内存然后忘记指向它的指针(例如,使用p=NULL;
或使用另一个p=malloc(1);
而不首先执行free(p);
),然后您引入了一个非常小的内存泄漏。不,这里没有内存泄漏
关键是您已经声明并初始化了一个字符数组。你可以用两种方法来做,这两种方法实际上是相同的:
第一种方式:
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;
此代码段中是否存在内存泄漏?--不,没有。不,这里没有内存泄漏
关键是您已经声明并初始化了一个字符数组。你可以用两种方法来做,这两种方法实际上是相同的:
第一种方式:
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;
此代码段中是否存在内存泄漏?--不,没有。不,字符串在堆栈上。内存泄漏通常发生在堆上。不管怎样,在问这些问题之前先学完C。写完你的书,它解释道