由于Uni的赋值,我面临着一个奇怪的问题,即必须将结构初始化为作为函数参数提供的指针。在该 init 函数中一切似乎都很好,但是一旦我尝试在不同的函数中访问对象的值,它们看起来就是空的。
由于我不擅长解释事情,我得到了一个带有实际和预期输出的小示例:
#include <stdlib.h>
#include <stdio.h>
struct foo {
int bar;
};
void init_foo(struct foo* f) {
f = malloc(sizeof(struct foo));
f->bar = 5;
printf("bar0: %dn", f->bar);
}
void print_foo(struct foo* f) {
printf("bar1: %dn", f->bar);
}
int main() {
struct foo f;
init_foo(&f);
print_foo(&f);
}
直接输出:
bar0: 5
bar1: 0
预期产出:
bar0: 5
bar1: 5
我以前没有处理过C,所以如果有人能对此提供解释和/或解决方案,我将不胜感激。
在main()
中,f
是foo
结构的分配版本。您将指向该已分配结构的指针传递给init_foo()
。
没有必要f
malloc()
init_foo()
内部。f
已经指向已分配的结构。
我认为如果你只是删除malloc()
,它应该可以工作。
不要在init_foo
里面malloc
;空间已经由调用者分配。 因此,您正在填充您malloc
编辑的空间,而不是传递给函数的指针所指向的空间。
你需要摆脱malloc()
,它不属于,因为main()
已经为其局部f
变量分配了内存。init_foo()
只需要填充现有内存。 通过调用malloc()
,您将更改init_foo()
内部的foo*
指针以指向不同的内存,而忽略传入的原始内存。
试试这个:
#include <stdlib.h>
#include <stdio.h>
struct foo {
int bar;
};
void init_foo(struct foo* f) {
f->bar = 5;
printf("bar0: %dn", f->bar);
}
void print_foo(struct foo* f) {
printf("bar1: %dn", f->bar);
}
int main() {
struct foo f;
init_foo(&f);
print_foo(&f);
}
另一方面,如果您希望init_foo()
为结构分配内存,请改为执行以下操作:
#include <stdlib.h>
#include <stdio.h>
struct foo {
int bar;
};
void init_foo(struct foo** f) {
*f = malloc(sizeof(struct foo));
if (f) {
(*f)->bar = 5;
printf("bar0: %dn", (*f)->bar);
}
}
void free_foo(struct foo* f) {
free(f);
}
void print_foo(struct foo* f) {
printf("bar1: %dn", f->bar);
}
int main() {
struct foo *f;
init_foo(&f);
if (f) {
print_foo(f);
free_foo(f);
}
}
或者这个:
#include <stdlib.h>
#include <stdio.h>
struct foo {
int bar;
};
struct foo* init_foo() {
struct foo *f = malloc(sizeof(struct foo));
if (f) {
f->bar = 5;
printf("bar0: %dn", f->bar);
}
return f;
}
void free_foo(struct foo* f) {
free(f);
}
void print_foo(struct foo* f) {
printf("bar1: %dn", f->bar);
}
int main() {
struct foo *f = init_foo(&f);
if (f) {
print_foo(f);
free_foo(f);
}
}
你正在黯然失色 struct foo* f。
你在main中定义了一个基于堆栈的结构结构foo f。你传递一个指向它的指针,指向init_foo函数。但是,您随后会立即将该结构指针替换为已分配的结构,并继续填充该结构。因此,传递给init_foo函数的原始结构体 foo* f 未被修改。
然后,通过退出 init_foo 函数泄漏内存,然后打印未初始化的结构。
您不需要内存分配,请将其全部删除。只需直接初始化到您传递给init_foo函数的结构体 foo* f 中即可。