如何在另一个.c中修改结构?
我试图在另一个.c中向我的结构添加一些数据,但我遇到了错误 这是我主要的一个例子。 我使用“REGISTER*reg”来使用另一个文件中的结构如何在另一个.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
#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(®,mom);
正如用户unholy Sheep所说,“REGISTER*reg;
是一个未初始化的指针-它不指向有效的REGISTER
对象。”
而不是声明REGISTER*reg代码>,只需声明为
REGISTER reg;
现在调用函数,例如:
set_mothersName(®,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(®, mom);
set_childsName(®, baby);
set_age(®, 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(®, mom);
set_childsName(®, baby);
set_age(®, 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”。现在它工作了!