如何解决什么时候分配字符数组堆与堆栈?
我很难理解什么时候以及什么时候不是一个 char 数组是堆/堆栈分配的,这取决于它们的声明方式。例如:
void test()
{
char *str1 = "MyString1"; // do i need to free this ??
char str2[] = "MyString2"; //this is clearly on the stack
}
我应该在退出 test() 之前调用 free(str1) 吗??
解决方法
你只需要free
你分配的东西。在你的例子中,没有什么可以释放的,因为编译器为它创建了一个静态存储,不能也不能释放。
您是否必须释放某些东西还取决于您调用的函数。例如,如果你调用 strdup()
那么你需要释放返回的指针:
char *p = strdup("MyString");
free(p);
但是,例如,如果您拨打 strcpy()
,那么您不会拨打免费电话。
char buffer[100];
strcpy(buffer,"MyString");
// Don't free,as you created a local buffer on the stack and strcpy() doesn't allocate anything.
在这里你必须释放,因为你分配了它:
char *p = malloc(100);
strcpy(p,"MyString");
free(p);
,
不,您不必释放两者:free()
总是在您将某些内容malloc()
用于动态维度时使用:您提供的两个声明之间的区别,除了一个是指针另一个是数组,只是一个可编辑性的问题:第一个是不可编辑的文字字符串,第二个是可编辑的,但它们都分配在堆栈上。
在这两个声明中
char *str1 = "MyString1";
char str2[] = "MyString2";
您只明确声明了一个字符数组 str2
。该数组具有自动存储持续时间,在退出声明它的函数后,它占用的内存将被释放。即退出函数后,数组将不存在,它占用的内存可以被其他对象重用。
当使用内存分配函数 malloc
或 calloc
分配数组时,您必须调用 free 函数。
在第一个声明中,您声明了一个指向字符串文字 "MyString1"
的第一个字符的指针。字符串文字在内部存储为一个字符数组,定义如下
char unnamed_string_literal[] = { 'M','y','S','t','r','i','n','g','1','\0' };
它具有静态存储持续时间,退出函数后仍处于活动状态。
另一方面,指针本身具有自动存储时长,退出函数后,其占用的内存可以重复使用。
,字符串字面量 "MyString1"
和 "MyString2"
存储在不同的数据段中(堆栈或堆除外)。
在第一种情况下,您正在创建一个新的 auto
类型“指向字符的指针”的变量(“str1”),并且字符串文字“MyString1”的地址是复制到它。
在第二种情况下,您正在创建一个新的 auto
变量(“str2”),其类型为“9 元素字符数组”(大小取自字符串文字),并将字符串文字“MyString2”的内容复制到其中。
The auto
variables are always local and are stored on the stack.
两个变量都存储在系统堆栈中,没有分配任何内容。因此,调用 free()
毫无意义。
PS:在程序结束时调用 free()
也没有意义,因为操作系统会处理它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。