gpt4 book ai didi

c - 为什么我在函数中创建的结构被覆盖?

转载 作者:太空宇宙 更新时间:2023-11-04 00:57:41 24 4
gpt4 key购买 nike

如何在函数中创建结构体?我正在尝试这种方式:

#include <string.h>
#include <stdio.h>

typedef struct { char name[10]; } Item;

typedef struct { Item *item; } MyStruct;

MyStruct make(char *name) {
MyStruct st;

Item item;
strcpy(item.name, name);
st.item = &item;
printf("name: %s\n", st.item->name);

return st;
}

int main() {
MyStruct s1, s2;
s1 = make("hi");
s2 = make("hey");

printf("\nname: %s\n", s1.item->name);
printf("name: %s\n", s2.item->name);
}

输出是:

name: hi
name: hey

name: hey
name: hey

当我创建 s2 时,结构 s1 被覆盖。看起来函数 make 上的结构 st 的地址在每次调用该函数时都是相同的。这是对的吗?如果可能,我想避免使用 malloc

编辑:在 macOS 和 Linux 上结果不同,上面的输出来自 Linux,下面的输出来自 macOS。为什么不一样?

name: hi
name: hey

name: p
name: p

最佳答案

当您声明 Item item; 时,您是在本地分配它,它超出了范围。下一个函数调用巧合地回收了相同的内存位置。

这是未定义的行为,因为如果要在该范围之外持续存在,您需要动态分配它。

关于c - 为什么我在函数中创建的结构被覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53365245/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com