如何在另一个.c中修改结构?

如何在另一个.c中修改结构?,c,C,我试图在另一个.c中向我的结构添加一些数据,但我遇到了错误 这是我主要的一个例子。 我使用“REGISTER*reg”来使用另一个文件中的结构 #include "otherfile.c" int main(){ char mom[30]; char baby[30]; int age; REGISTER *reg; scanf("%s", mom); scanf("%s", baby); scanf("%d", &age); se

我试图在另一个.c中向我的结构添加一些数据,但我遇到了错误

这是我主要的一个例子。 我使用“REGISTER*reg”来使用另一个文件中的结构

#include "otherfile.c"

int main(){
   char mom[30];
   char baby[30];
   int age;

   REGISTER *reg;

   scanf("%s", mom);
   scanf("%s", baby);
   scanf("%d", &age);

   set_mothersName(reg,mom);
   set_childsName(reg,baby);
   set_age(reg,age);

return 0;
}
在另一个文件中,我尝试以下操作:

typedef struct register{
   char mothersName[30];
   char childsName[30];
   int age;
}REGISTER;

void set_mothersName(REGISTER *reg, char* name){
   strcpy(reg->mothersName,name);
}
void set_childsName(REGISTER *reg, char*name){
   strcpy(reg->childsName,name);
}
void set_age(REGISTER* reg, int age){
   reg->age = age;
}

我认为我使用的指针是错误的,但我不知道在哪里以及为什么。

正如用户unholy Sheep所说“
REGISTER*reg;
是未初始化的指针-它没有指向有效的
REGISTER
对象。”

而不是声明
REGISTER*reg,只需声明为

REGISTER reg;
现在调用函数,例如:

set_mothersName(&reg,mom);

正如用户unholy Sheep所说,“
REGISTER*reg;
是一个未初始化的指针-它不指向有效的
REGISTER
对象。”

而不是声明
REGISTER*reg,只需声明为

REGISTER reg;
现在调用函数,例如:

set_mothersName(&reg,mom);

正如其他答案所述,未初始化指针存在问题。碰巧的是,寄存器是一个C关键字,因此您可能希望将小写寄存器更改为类似s_寄存器的内容,以避免混淆和可能的编译错误。 既然你似乎在学习指针,我将更深入地解释一下

当声明
寄存器*reg您声明一个大小为8的指针,该指针将包含指向您手动分配的空间的地址。默认情况下,指针未初始化,因此基本上有一个指向内存中随机位置的指针

当声明
寄存器reg,在堆栈上声明一个大小为64(结构大小)的变量,并分配其空间,就像声明一个字符(大小1)一样。使用
&
符号时,您可以访问此结构的地址,即指向此分配空间的指针

我重写了你的代码,添加了一个.h文件来声明你的函数,因为我在尝试你的函数时遇到了编译错误,编译器发现你的函数有多个声明

代码如下:

文件c:

    #include "declar.h"
    #include <stdio.h>

    int main()
    {
       char mom[30];
       char baby[30];
       int age;

       REGISTER reg;

       scanf("%s", mom);
       scanf("%s", baby);
       scanf("%d", &age);

       set_mothersName(&reg, mom);
       set_childsName(&reg, baby);
       set_age(&reg, age);

       return 0;
    }
让我知道如果这对你有效,也要小心在实际的word应用程序中使用scanf,它很容易通过溢出缓冲区来破坏。
希望这对您有所帮助:)

正如其他答案所述,您遇到了未初始化指针的问题。碰巧的是,寄存器是一个C关键字,因此您可能希望将小写寄存器更改为类似s_寄存器的内容,以避免混淆和可能的编译错误。 既然你似乎在学习指针,我将更深入地解释一下

当声明
寄存器*reg您声明一个大小为8的指针,该指针将包含指向您手动分配的空间的地址。默认情况下,指针未初始化,因此基本上有一个指向内存中随机位置的指针

当声明
寄存器reg,在堆栈上声明一个大小为64(结构大小)的变量,并分配其空间,就像声明一个字符(大小1)一样。使用
&
符号时,您可以访问此结构的地址,即指向此分配空间的指针

我重写了你的代码,添加了一个.h文件来声明你的函数,因为我在尝试你的函数时遇到了编译错误,编译器发现你的函数有多个声明

代码如下:

文件c:

    #include "declar.h"
    #include <stdio.h>

    int main()
    {
       char mom[30];
       char baby[30];
       int age;

       REGISTER reg;

       scanf("%s", mom);
       scanf("%s", baby);
       scanf("%d", &age);

       set_mothersName(&reg, mom);
       set_childsName(&reg, baby);
       set_age(&reg, age);

       return 0;
    }
让我知道如果这对你有效,也要小心在实际的word应用程序中使用scanf,它很容易通过溢出缓冲区来破坏。
希望这对您有所帮助:)

REGISTER*reg
是一个未初始化的指针-它不指向有效的
寄存器
对象。因此,要将其初始化,是否必须使用动态分配?在这种情况下,您只需将其声明为
REGISTER reg
并将
®
作为参数传递给functions@UnholySheep但随后会出现“错误:不知道'reg'的存储大小”,在这种情况下,您没有包含您声称包含的文件。请创建一个真正的
REGISTER*reg
是一个未初始化的指针-它不指向有效的
寄存器
对象。因此,要将其初始化,是否必须使用动态分配?在这种情况下,您只需将其声明为
REGISTER reg
并将
®
作为参数传递给functions@UnholySheep但随后会出现“错误:不知道'reg'的存储大小”,在这种情况下,您没有包含您声称包含的文件。请在“otherfile.c”中定义结构“REGISTER”时创建一个真实的注册表。现在它工作了!我在“otherfile.c”中定义结构“REGISTER”。现在它工作了!