c - 结构和指针。不清楚的输出

标签 c

有人可以向我解释为什么以下代码的输出是 6 而不是 5 吗?我不明白调用 hoo 是如何改变 m->x 的值的。 即使在运行代码并按照它的每一步进行操作之后,我仍然不清楚。

#include <stdio.h>
#include <stdlib.h>

typedef struct a {
    int x;
    struct a* next;
}a_t;

a_t* foo() {
    a_t* varp, var = { 5,NULL };
    varp = &var;
    return varp;
}

a_t* hoo() {
    a_t* varp, var = { 6,NULL };
    varp = &var;
    return varp;
}

void main()
{
    a_t* m = foo();
    hoo();
    printf("%d", m->x);
}

最佳答案

您的函数 hoofoo 正在返回指向局部变量的指针,这根据定义是 *undefined behavior`。

它们都实现了不同的结构(2 个副本),您正在打印第一个的值。

自从您第一次使用函数 foo 在堆栈上创建结构以来,您很幸运,函数 hoo 也在同一位置在堆栈上创建了函数。

因此你有覆盖。

如果您想从函数返回指针,请使用 static 或使用 malloc 在堆上动态分配内存。

a_t* foo() {
    a_t* varp = malloc(sizeof(*varp));
    varp->m = 5;
    return varp;
}

void main()
{
    a_t* m = foo();
    hoo();
    printf("%d", m->x);
    free(m);
}

现在您在堆栈外分配内存,它将按您预期的那样工作。

关于c - 结构和指针。不清楚的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45118575/

相关文章:

c - 在文件中存储 float

c - posix 扩展正则表达式 : (()|abc)xyz 的预期行为

c - C语言中位域的实际用途是什么?

c++ - 静态全局变量的地址改变了吗?

c - 为什么 static 关键字在这里防止段错误?

c - 在 Windows 或 Linux 上为 Raspberry Pi 构建 C 可执行文件

c - POSIX Linux 间隔定时器的可移植解决方案(timer_create、timer_settime...)

c# - C# 程序在哪里寻找 DLL?

c - 为什么使用本地指针来迭代列表?

c - #including 标准库是如何工作的?