在下面的程序中是否需要释放分配给字符串“str”的内存?如果是,free(str)是否有效?在哪个段中,内存被分配给“str”?
int main()
{
function()
}
function()
{
char *str="hello";
--
--
return
}
答案 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
相关函数之一(calloc
,realloc
或POSIX,posix_memalign
)。
这不是你是否“需要”free
你的字符串。更重要的是你不允许free
它。充其量(如果您的C库对您非常友好),它将检测您对free
字符串文字的尝试并立即中止您的程序。如果你运气不好,你会默默地破坏内存,要么在很难追查根本原因时崩溃,要么在下次点击你的应用程序中的“保存”时用腐败的废话覆盖重要数据。
答案 3 :(得分:0)
如果您反汇编代码的可执行文件(对于ex使用gdb),您将能够看到“hello”被推送到堆栈。因此具有该功能的寿命范围。