Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:初始化结构并将其分配给函数参数中的指针_C_Pointers_Struct_Malloc - Fatal编程技术网

C:初始化结构并将其分配给函数参数中的指针

C:初始化结构并将其分配给函数参数中的指针,c,pointers,struct,malloc,C,Pointers,Struct,Malloc,由于Uni的赋值,我面临着一个奇怪的问题:必须将结构初始化为作为函数参数提供的指针。init函数中的一切看起来都很好,但一旦我尝试访问另一个函数中的对象值,它们就会显示为空 由于我不善于解释,所以我举了一个小例子,说明了实际和预期的结果: #include <stdlib.h> #include <stdio.h> struct foo { int bar; }; void init_foo(struct foo* f) { f = malloc(si

由于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: %d\n", f->bar);
}

void print_foo(struct foo* f) {
    printf("bar1: %d\n", f->bar);
}

int main() {
    struct foo f;
    init_foo(&f);
    print_foo(&f);
}
bar0: 5
bar1: 5
预期产出:

#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: %d\n", f->bar);
}

void print_foo(struct foo* f) {
    printf("bar1: %d\n", f->bar);
}

int main() {
    struct foo f;
    init_foo(&f);
    print_foo(&f);
}
bar0: 5
bar1: 5
我以前很少处理C,所以如果有人能对此提供解释和/或解决方案,我将非常感谢。

main()
中,
f
foo
结构的分配版本。您将指向该分配结构的指针传递给
init\u foo()

无需将
f
置于
init\u foo()
内部
f
已指向已分配的结构


我认为,如果您只是删除
malloc()
,它应该可以工作。

您需要删除
malloc()
,它不属于任何对象,因为
main()
已经为其本地
f
变量分配了内存
init_foo()
只需填充现有内存即可。通过调用
malloc()
,您将
init\u foo()
中的
foo*
指针更改为指向不同的内存,忽略传入的原始内存

请尝试以下方法:

#包括
#包括
结构foo{
int-bar;
};
void init_foo(结构foo*f){
f->bar=5;
printf(“bar0:%d\n”,f->bar);
}
无效打印\u foo(结构foo*f){
printf(“bar1:%d\n”,f->bar);
}
int main(){
结构foo f;
init_foo(&f);
印务及财务部;
}
另一方面,如果希望
init_foo()
为结构分配内存,请执行以下操作:

#包括
#包括
结构foo{
int-bar;
};
void init_foo(结构foo**f){
*f=malloc(sizeof(struct foo));
如果(f){
(*f)->bar=5;
printf(“bar0:%d\n”,(*f)->bar);
}
}
void free_foo(结构foo*f){
免费(f);
}
无效打印\u foo(结构foo*f){
printf(“bar1:%d\n”,f->bar);
}
int main(){
结构foo*f;
init_foo(&f);
如果(f){
印务局局长(f);
免费(f),;
}
}
或者这个:

#包括
#包括
结构foo{
int-bar;
};
结构foo*init_foo(){
struct foo*f=malloc(sizeof(struct foo));
如果(f){
f->bar=5;
printf(“bar0:%d\n”,f->bar);
}
返回f;
}
void free_foo(结构foo*f){
免费(f);
}
无效打印\u foo(结构foo*f){
printf(“bar1:%d\n”,f->bar);
}
int main(){
struct foo*f=init_foo(&f);
如果(f){
印务局局长(f);
免费(f),;
}
}

不要
malloc
init_foo
内;调用者已分配了空间。因此,您正在填充您
malloc
ed的空间,而不是传递给函数的指针指向的空间。

您正在覆盖struct foo*f

在main中定义了一个基于堆栈的结构struct foo f。您将一个指针传递给它,指向init_foo函数。但是,然后立即用分配的结构替换该结构指针,并继续填充该结构。因此,未修改传递到init_foo函数的原始结构foo*f

然后通过退出init_foo函数泄漏内存,然后打印未初始化的结构


您不需要内存分配,请将其全部删除。只需直接初始化到结构foo*f,然后传递到init_foo函数。

非常感谢:)(你是第一个回答这个问题的人,所以我会尽快接受)“你是第一个回答这个问题的人”-只需7秒;-)@雷米尔博必须支持新来者:帕。谢谢我写“C”的时间太长了。“我想这些天我最喜欢的语言是PHP。”亨利夫说,我当时应该接受另一个答案。什么怪物会喜欢PHP胜过任何东西?!感谢您提供的额外知识,但在我的情况下,仅删除malloc就足够了:)