【问题标题】:How can I modify an struct in another .c?如何修改另一个 .c 中的结构?
【发布时间】:2020-05-28 12:45:02
【问题描述】:

我正在尝试在另一个 .c 中将一些数据添加到我的结构中,但我遇到了段错误。

这是我的 main.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;
}

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

【问题讨论】:

  • REGISTER *reg; 是一个未初始化的指针 - 它没有指向一个有效的 REGISTER 对象
  • 所以要初始化它,我必须使用动态分配吗?
  • 在这种情况下,您可以简单地将其声明为 REGISTER reg; 并将 &reg 作为参数传递给您的函数
  • @UnholySheep 但是然后它得到“错误:'reg'的存储大小不知道”
  • 在这种情况下,您没有包含您声称自己包含的文件。请创建一个真实的minimal reproducible example

标签: c


【解决方案1】:

正如其他答案所述,您遇到了未初始化指针的问题。 register 是 C 关键字 也恰好发生了这种情况,因此您可能希望将小写寄存器更改为类似 s_register 的内容,以避免混淆和可能的编译错误。 由于您似乎正在学习指针,因此我将在我的解释中进行更深入的说明。

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

在声明REGISTER reg; 时,您在堆栈上声明了一个大小为 64(结构大小)的变量,并分配了它的空间,就像您声明一个 char(大小 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;
    }

其他文件.c:

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

    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;
    }

声明.h:

    #ifndef DECLAR_H_
    # define DECLAR_H_

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

    void set_mothersName(REGISTER *reg, char *name);
    void set_childsName(REGISTER *reg, char *name);
    void set_age(REGISTER *reg, int age);

    #endif

如果这对你有用,请告诉我,在实际应用程序中使用 scanf 时也要小心,它很容易通过简单地溢出缓冲区来破坏。 希望这对您有所帮助:)

【讨论】:

  • 我在“otherfile.c”中定义了结构“REGISTER”。现在可以了!
【解决方案2】:

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

不要声明REGISTER *reg;,而是声明为

REGISTER reg;

现在调用函数,例如:

set_mothersName(&reg,mom);

【讨论】:

    猜你喜欢
    • 2018-12-04
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多