【发布时间】:2020-11-09 08:48:08
【问题描述】:
我想将我的 struct 指针作为 void 指针返回。在这个函数中,当我打印 noOfTuples 时,我正确地得到了零。
typedef void* HashjoinDatabase;
HashjoinDatabase HashjoinAllocateDatabase(unsigned long totalNumberOfEdgesInTheEnd) {
HashjoinDatabase db;
struct database* d = malloc(sizeof(struct database));
if(d == NULL) {
puts("Some kind of malloc() error");
}
d->tuples = malloc(totalNumberOfEdgesInTheEnd * sizeof(struct tuple));
if(d->tuples == NULL) {
puts("Some kind of malloc() error");
}
d->noOfTuples = 0;
db = &d;
printf("Hello %i\n", d->noOfTuples);
return db;
}
但是,当我在 main 中将返回的 void 指针转换回结构指针并尝试获取相同的 noOfTuples 时,每次运行都会得到很大的变化值,我怀疑这些值是地址
int main() {
HashjoinDatabase testDB = HashjoinAllocateDatabase(10);
int no = ((struct database*)testDB)->noOfTuples;
printf("Hello %i", no);
return 0;
}
【问题讨论】:
-
在 typedef 后面隐藏结构是一回事,但是在 typedef 后面隐藏 pointer 是个坏主意。为什么不直接编写普通代码并返回正确的指向类型的指针?
-
您的问题是您正在重新调整地址指针
d,它是一个局部变量,在函数返回时超出范围。你想要db = d或者只是`return d`。 -
然后找到更好的课程... :-D
-
请在此处指导您的讲师,以便专业人员向他/她解释他们的代码错误的原因。这是一种可怕的模式,因为有些人不懂 C 语言。
-
将指针隐藏在 typedef 后面是个坏主意,但将
void*隐藏在HashjoinDatabase等违反直觉的名称后面尤其不合逻辑。
标签: c