关于C语言指针的问题

  在学习关于C语言指针的时候,发现这样一个问题,代码如下:

复制代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct A{
    int a;
    char b;
};

struct B{
    struct A *n;
};
struct B *new_B(){
    struct A t = { 100, 'c'};
    struct B *p;
    p = (struct B *) malloc(sizeof(struct B));
    p->n = &t;
    return p;
}
int main(void) {
    struct B *p;
    p = new_B();
    printf("%d, %c\n", p->n->a, p->n->b);
    free(p);
    return 0;
}
复制代码

  函数new_B的作用是新建一个结构体B的指针变量p,并为它分配内存,然后在函数中建立一个结构体A的变量t,并把这个变量的地址&t赋给B的成员n(n是结构体A的指针)。我们知道, t是一个局部变量,存放在栈中,在函数new_B执行结束后,t会被释放。而当我们返回主函数,然后输出,可以得到正确的结果。如果我们去掉分配内存这一行,也就是p = (struct B *) malloc(sizeof(struct B)); 执行就会出错(这也是我想要得到的结果)。

  问题是,就算分配了内存,new_B函数执行完以后t就会被释放掉,那么在主函数访问 p->n是,应该也会出错。为什么在主函数中还可以访问呢? 

  请大牛给予指导解答!!!

 

 

posted @   AfterSummer  阅读(831)  评论(16编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示