返回指针到一个自动可变(Returning a pointer to an automatic va

2019-06-17 23:43发布

假设你有以下功能:

char *getp()
{
    char s[] = "hello";
    return s;
}

由于功能是在函数返回一个指针到一个局部变量来使用外,将它引起了内存泄漏?

PS我仍然在学习C所以我的问题可能有点天真...

[更新]
所以,如果说你要返回一个新char[]数组(即可能的子功能),你怎么只返回? 它应该是指向一个外部变量? 即char[]是不是本地的功能?

Answer 1:

它不会导致内存泄漏。 它会导致悬挂引用。 局部变量是在栈中分配,并会尽快,因为它超出范围释放。 其结果是,当函数结束时,指针,你正在返回不再指向你自己的记忆。 这不是一个内存泄漏(内存泄漏是当你分配一些内存,并且不释放它)。

[更新]:为了能够在返回的功能分配的数组,你应该分配它外面堆(例如,在堆)等:

char *test() {
    char* arr = malloc(100);
    arr[0] = 'M';
    return arr;
}

现在,如果你不free您在使用完之后,在调用函数的内存,你有内存泄漏。



Answer 2:

不,它不会泄露,因为它的后getp()结束销毁;

这将导致不确定的行为,因为现在你有一个指针不再持有你怎么想这样做,而且任何人都可以重复使用的存储区。

如果您保存在堆上数组,而不执行调用free会发生内存泄漏()。

char* getp(){

   char* p = malloc(N);
   //do stuff to p
   return p;
}

int main(){
    char* p = getp();
    //free(p) No leak if this line is uncommented
    return 0;
}

在这里,对不被破坏,因为它不是在栈中,但在人堆里。 然而,一旦程序结束,分配的内存没有被释放,造成内存泄漏(即使它做一次过程中死亡)。

[UPDATE]

如果你想从一个函数返回一个新的C弦,你有两个选择。

  • 在堆存储它(如上述或类似的例子中这个真实的例子 ,它返回一个重复的字符串);
  • 传递的缓冲区参数

例如:

    //doesnt exactly answer your update question, but probably a better idea.
    size_t foo (const char* str, size_t strleng, char* newstr);

在这里,你不得不中newstr调用foo函数在什么地方分配内存(可堆栈或堆)。 在这种特殊情况下,它会返回在文字中newstr的量。



Answer 3:

这不是一个内存泄漏,因为内存被释放正确。

但这是一个错误。 你有一个指针未分配的内存。 它被称为悬空参考 ,并且在C.错误的公共源极的结果是不确定的。 你不会看到,直到运行时的任何问题,当您尝试使用该指针。



Answer 4:

自动变量在函数调用结束时被销毁; 你不能返回一个指向他们。 你在做什么可以被描述为“返回一个指针用来装S,内存块,但现在是未使用(但可能仍然有东西在里面,至少目前如此),并且将迅速装满东西其他完全“。



Answer 5:

它不会造成内存泄漏,但它会导致未定义的行为。 这种情况是非常危险的,因为指针会在程序的堆栈点的地方,如果你使用它,您将访问随机数据。 这样的指针,通过书面的时候,也可以用来攻击程序的安全性,并使其执行任意代码。



Answer 6:

没有其他人还没有提到另一种方式,可以让这个构造有效的:告诉你想要的数组“S”编译器拥有的“静态存储时间”(这意味着它生活在节目的生命,就像一个全球变量)。 此功能是通过关键字“静态”:

char *getp()
{
    static char s[] = "hello";
    return s;
}

现在,这种方法的缺点是,现在是S的只有一个实例,在getp()函数的每次调用之间共享。 随着为你写它的函数,这并不重要。 在更复杂的情况下,它可能不是你想要的。

PS:通常的那种局部变量有什么是所谓的“自动存储时间”,这意味着该变量的新实例被带入存在,当函数被调用,并消失在函数返回时。 有一个相应的关键字“汽车”,但它无论如何暗示,如果你不使用“静态”的,所以你几乎从来没有看到它在现实世界中的代码。



Answer 7:

我把代码放在一个调试器,看拆卸和存储器窗口后删除了我刚才的答复。

在问题的代码是无效的,并且返回一个参考堆栈存储器,这将被覆盖。

这个版本略有不同,然而,返回到固定内存的引用,和正常工作:

char *getp()
{
    char* s = "hello";
    return s;
}


Answer 8:

s是堆栈变量-它会自动在函数的结束解引用。 然而,你的指针将是无效的,并指可能在任何时候被覆盖的内存区域。



文章来源: Returning a pointer to an automatic variable