释放字符串char * str =“hello”的内存

时间:2010-12-24 07:13:17

标签: c

在下面的程序中是否需要释放分配给字符串“str”的内存?如果是,free(str)是否有效?在哪个段中,内存被分配给“str”?

int main()
{
    function()
}

function()
{
    char *str="hello";
     --
     --
     return
}

4 个答案:

答案 0 :(得分:8)

char *str= "hello";

字符串文字"Hello"存储在const内存区域(在大多数常见实现中),并具有静态存储持续时间。任何修改内容的尝试都会调用UB,即str[0]='c'会导致大多数实现的段错误。

ISO C99 2.13.4/1

  

普通字符串文字的类型为“n const char数组”和静态存储持续时间。

'static storage duration' in 3.7.1/1:

  

这些对象的存储应持续该程序的持续时间。


  

是否需要在以下程序中释放分配给字符串"str"的内存?

Nopes!那也是UB,因为字符串没有动态分配。

答案 1 :(得分:3)

字符串常量未在“堆”上分配 - 分配了free()所需的内存。它们被分配在另一个特殊的段中,并且没有办法实际“释放”这个内存 - 即使它对程序中的其他内容有用。 free(str)会导致崩溃(分段错误),或者如果您的C库足够智能,则会产生错误,通知您内存损坏。

您应该free()仅使用malloc()分配的值,或者将手册中具体描述的函数返回值作为返回malloc() ed结果,您必须释放。别管其余了。

答案 2 :(得分:1)

其他大多数答案已经非常完整,但有一点没有得到足够的重视,那就是使用free 指示 指针允许传递给free 指针是通过malloc获得的,“就像通过malloc” (某些库函数记录为返回此类指针),或通过其他malloc相关函数之一(callocrealloc或POSIX,posix_memalign)。

这不是你是否“需要”free你的字符串。更重要的是你不允许free它。充其量(如果您的C库对您非常友好),它将检测您对free字符串文字的尝试并立即中止您的程序。如果你运气不好,你会默默地破坏内存,要么在很难追查根本原因时崩溃,要么在下次点击你的应用程序中的“保存”时用腐败的废话覆盖重要数据。

答案 3 :(得分:0)

如果您反汇编代码的可执行文件(对于ex使用gdb),您将能够看到“hello”被推送到堆栈。因此具有该功能的寿命范围。