[英]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(®, mom);
set_childsName(®, baby);
set_age(®, 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(®,mom);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.