在C中:为什么在函数之外存在堆栈分配结构?

Rit*_*ose 5 c stack heap-memory

我的功能:

struct hostent * gethost(char * hostname){
    if(/*some condition under which I want 
         to change the mode of my program to not take a host*/){
       return null
    }
    else{
        struct hostent * host = gethostbyname(hostname);
        return host;
    }
}
Run Code Online (Sandbox Code Playgroud)

在主要:

struct hostent * host = gethost(argv[2]);
Run Code Online (Sandbox Code Playgroud)

(忽略代码中的任何小错误,我从内存中喷出)

这很好用.尽管事实上我没有自由,但Valgrind并没有告诉我,我正在失去记忆.

为什么?我认为在堆栈上分配的东西会随着函数调用返回而消失?或者是因为我返回指针?这有什么危险吗?

Gab*_*abe 10

host没有在堆栈上分配,只有指向它的指针在堆栈上.函数返回时会复制指针,因此代码没有任何问题.

请注意,gethostbyname实际上并不动态分配内存.它总是返回一个指向同一个静态分配的内存块的指针,这就是valgrind不报告泄漏的原因.但要小心,因为这意味着hostent如果要稍后保存该值,则必须复制函数返回的值,因为进一步调用gethost将覆盖它.