如何解决如何使用void指针通过多个级别将多个结构作为相同参数传递
我有多个结构,我试图使用 void 指针将其传递给函数的同一个参数,但它不起作用,我不知道为什么。
我创建了一个简单的测试用例来展示我遇到的问题。如果我在 repl 中用 clang 编译它可以工作,但如果我在 Linux mint 上用 gcc 编译,我对第二个 printf 语句感到胡说八道。
代码如下:
#include <stdio.h>
struct Test {
char *name;
};
void *create();
void update(void *data);
struct Test *test_create();
void test_update(struct Test *test);
int main()
{
void *currentData = create();
update(currentData);
return 0;
}
void *create()
{
void *data = test_create();
return data;
}
void update(void *data)
{
struct Test *test = data;
printf("a %s\n",test->name);
test_update(test);
}
struct Test *test_create()
{
struct Test *test = &(struct Test) {
.name = "test",};
return test;
}
void test_update(struct Test *test)
{
printf("b %s\n",test->name);
}
我做错了什么?什么操作是未定义的?
解决方法
在 test_create
中,您正在创建一个复合文字并返回一个指向它的指针。复合文字的生命周期是其封闭范围的生命周期,因此当函数返回时,您将返回一个指向不再存在的对象的指针。这会触发 undefined behavior。
您应该改为动态分配内存,以便在函数返回后它仍然存在。
struct Test *test_create()
{
struct Test *test = malloc(sizeof *test);
test->name = "test";
return test;
}
确保在不再使用时free
此内存。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。