微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

什么时候分配字符数组堆与堆栈?

如何解决什么时候分配字符数组堆与堆栈?

我很难理解什么时候以及什么时候不是一个 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。该数组具有自动存储持续时间,在退出声明它的函数后,它占用的内存将被释放。即退出函数后,数组将不存在,它占用的内存可以被其他对象重用。

当使用内存分配函数 malloccalloc 分配数组时,您必须调用 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 举报,一经查实,本站将立刻删除。