繁体   English   中英

如何修改 another.c 中的结构?

[英]How can I modify an struct in another .c?

我正在尝试向 another.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 也是一个 C 关键字,因此您可能希望将小写 register 更改为类似 s_register 的内容,以避免混淆和可能的编译错误。 既然你似乎在学习指针,我将 go 在我的解释中更深入一点。

当声明一个REGISTER *reg; 您声明一个大小为 8 的指针,它将包含指向您手动分配的空间的地址。 默认情况下,指针没有被初始化,所以你基本上有一个指向 memory 中随机位置的指针。

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

我重写了你的代码,添加了 ah 文件来声明你的函数,因为我在尝试你的编译时遇到了错误,编译器为你的函数找到了多个声明。

这是代码:

文件.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 也要小心,简单地溢出缓冲区很容易破坏。 希望这对你有帮助:)

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

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

REGISTER reg;

现在调用函数,例如:

set_mothersName(&reg,mom);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM