C中的细分错误,无法说明原因

时间:2019-02-15 16:35:05

标签: c core fault

我有一个应该以非常糟糕的方式读取文件的功能。我希望它可以修改作为参数传递的结构,以存储它必须读取的内容。但是当我调用它时,它会引发分段错误。我将打印内容作为功能要做的第一件事,但它没有做到。所以我想我对函数的声明或某些问题有疑问。我不知道。

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

但是它仍然显示出细分错误。

2 个答案:

答案 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,要么是分配有malloccalloc的新堆内存。

此外,如果您的函数确实要使用指向struct client_config的指针,则该参数也应该具有*运算符。