【问题标题】:Segmentation fault in C, can't figure whyC中的分段错误,不知道为什么
【发布时间】:2019-02-15 16:35:05
【问题描述】:

我有一个函数应该读取(以一种非常糟糕的方式)一个文件。我希望它修改我作为参数传递的结构以存储它必须读取的内容。但是当我调用它时,它会引发分段错误。我有一个 print 作为该函数所做的第一件事,但它没有这样做。所以我想我对函数的声明或其他东西有问题。我想不通。

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

但它仍然显示分段错误。

【问题讨论】:

  • config 没有指向任何地方,但您在调用函数时取消引用它。 未定义的行为原样。
  • 那我该如何解决呢?
  • config 定义为一个结构,而不是指向它的指针。然后传递它的地址。
  • 那你还有一些其他的问题,或者你没有做好。发布正确的minimal reproducible example
  • 你的read_software_config_file 应该带指针,顺便说一句。你看到编译器警告了吗?你应该有一些。

标签: c core fault


【解决方案1】:

这是一个工作示例:

#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(或包含标头等)s.t.当您在 main 中调用它时,编译器会知道签名。

正如 cmets 中所说,您应该使用指向结构的指针 s.t.可以修改。

运行main后的输出为:

Hello
config.data = 12

【讨论】:

    【解决方案2】:

    当您声明任何变量(无论是否为指针)时,未对其进行初始化,它会获取内存中的任何内容作为其当前值。一些高级语言可能会使用“默认”变量隐式初始化所有新值。您可能已经从以前的编程经验中习惯了这一点;在 C 中情况并非如此。

    如果您在未初始化的指针上使用* 取消引用运算符,您将取消引用指针当前值表示的任何地址,这是未定义的行为,并且几乎肯定会导致访问冲突。

    你需要初始化你的指针来指向某个东西;现有的struct client_config,或者使用malloccalloc 分配的新堆内存。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多