C中的数组及其指针

col*_*guy 5 c memory heap stack

老问题,但我仍然有一些想法.

char * getarrmal(void)
{
    char *str;
    str = (char *)malloc(10);
    str[0] = 'a';
    str[1] = 'b';
    str[2] = 'c';
    str[3] = '\0';
    return str;
}

char * getarrdef(void)
{
    char *str = "hello";
    return str;
}

char * getarrfix(void)
{
    char str[10] = "world";
    return str;
}
Run Code Online (Sandbox Code Playgroud)

三个功能.前两个将返回字符串地址,字符串存储在堆中,以便您可以继续使用它,例如main()函数.

在最后一个函数中,str是一个局部变量,并且不能使用返回的str.

我的问题是,当我返回调用前两个函数时,我应该手动释放它们吗?很容易相信malloc的情况确实如此,但我不确定它是否也是char*str ="hello"的情况.

如果我使用getarrdef()并且不释放它的返回值,那么我会以某种方式泄漏内存吗?

pax*_*blo 4

不,你绝对应该尝试释放第二个。它存储在堆中,而是一个字符串文字,尝试释放它是未定义的行为。从C++11 7.21.3.3 The free function

...如果参数与内存管理函数先前返回的指针不匹配,或者如果空间已通过调用 free 或 realloc 释放,则行为未定义。

对于第一个,是的,分配内存的责任与内存本身一起传递是一个很好的做法。这意味着,如果某些东西分配了它并将其提供给您,那么就有责任释放它。

即使您通过将其传递回函数来释放它,情况也是如此:delarrmal()- 通过这样做,您已经赋予该函数释放它的责任。

  • @coldguy,在前两种情况下,“str”(指针)存储在堆栈上,而在第三种情况下,“str”(数组)存储在堆栈中。然而,指针指向的内容在前两种情况下有所不同(第三种情况无关紧要,因为 str 不是指针(在函数内))。在第一种情况下,它指向堆,在第二种情况下,它指向不在堆中的字符串文字。 (2认同)