我有一个应该以非常糟糕的方式读取文件的功能。我希望它可以修改作为参数传递的结构,以存储它必须读取的内容。但是当我调用它时,它会引发分段错误。我将打印内容作为功能要做的第一件事,但它没有做到。所以我想我对函数的声明或某些问题有疑问。我不知道。
int main(int argc, char **argv){
//some parser here
struct client_config *config;
read_software_config_file(*config); //I also passed it as non pointer and & but nothing worked.
}
void read_software_config_file(struct client_config config){
printf("Hello"); //it breaks here
}
正如有人指出的那样,我这样做了:
struct client_config config;
read_software_config_file(&config);
但是它仍然显示出细分错误。
答案 0 :(得分:0)
这是一个有效的示例:
#include <stdio.h>
struct client_config
{
int data;
};
void read_software_config_file(struct client_config *config); // Forward Declaration
int main(int argc, char **argv)
{
struct client_config config; // Memory on stack. Use malloc/calloc for heap
config.data = 10; // Init data
read_software_config_file(&config);
printf("config.data = %d\n", config.data);
return 0;
}
void read_software_config_file(struct client_config *config)
{
printf("Hello\n");
config->data = 12;
}
我通常建议使用-Wall -Wextra -pedantic
进行编译,以及早发现错误。
您必须向前声明函数read_software_config_file
(或包括标头等)。当您在main中调用签名时,编译器就会知道签名。
如评论中所述,您应该使用指向结构s.t.的指针。可以修改。
运行main之后的输出是:
Hello
config.data = 12
答案 1 :(得分:0)
当声明任何变量(无论是否为指针)时,如果不对其进行初始化,则它将获取内存中的任何内容作为其当前值。一些高级语言可能会使用“默认”变量隐式初始化所有新值。您可能已经从以前的编程经验中适应了这一点;在C中不是这种情况。
如果对未初始化的指针使用*
取消引用运算符,则将取消引用该指针的当前值所表示的任何地址,这是未定义的行为,并且几乎肯定会导致访问冲突。 / p>
您需要初始化指针以指向某物;要么是现有的struct client_config
,要么是分配有malloc
或calloc
的新堆内存。
此外,如果您的函数确实要使用指向struct client_config
的指针,则该参数也应该具有*
运算符。