You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何返回局部变量内存地址报错,返回指向它的指针却无问题?

问题:返回栈变量指针时,为何直接返回&node报错,返回指向它的temp却不报错?

结构体定义

struct Node {
    void* val;
    struct Node* next;
};

待排查代码

struct Node* createNode(void* value) {
    struct Node node = {.val = value, .next = NULL};
    //struct Node* temp = &node;
    return &node;
}

问题详情

当返回&node时,编译器提示错误:address of stack memory associated with local variable 'node' returned。但取消注释struct Node* temp = &node;并返回temp后,这个错误提示就消失了。明明temp指向的也是栈上的node,为什么编译器不报错?


解答

这其实是编译器静态分析的局限性导致的。

编译器的基础静态检查会直接识别「返回局部变量地址」这种直白写法,所以抛出警告。但当你把地址先存在局部指针temp里再返回时,简单的静态分析没法追踪到temp最终指向的还是栈上的局部变量node,因此没触发警告。

但要注意:两种写法都是完全错误且危险的。函数执行完毕后,栈上的局部变量node会被销毁,返回的指针会变成「野指针」,后续使用这个指针会引发未定义行为(程序崩溃、数据错乱都有可能)。

正确的写法应该是用malloc在堆上分配内存:

struct Node* createNode(void* value) {
    struct Node* node = malloc(sizeof(struct Node));
    if (node == NULL) {
        // 处理内存分配失败的情况,比如返回NULL或终止程序
        return NULL;
    }
    node->val = value;
    node->next = NULL;
    return node;
}

返回堆内存的指针不会随函数结束被销毁,后续使用完记得用free(node)释放内存即可。


内容的提问来源于stack exchange,提问作者nameless___

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 03:02:21