【问题标题】:Segmentation_Fault error when reading from a file.cfg从 file.cfg 读取时出现 Segmentation_Fault 错误
【发布时间】:2021-09-05 02:00:55
【问题描述】:

您好,我正在尝试编写代码,如何打印从配置文件中获取值的动态结构 这是包含网关数量的配置文件,每个网关都有不同的参数

nbre_GW = "3" 
GW1 = "192.168.1.12;502;1;2;3"
GW2 = "192.168.1.13;505;5;6;45"
GW3 ="192.168.1.14;503;11;12;3"

我正在使用这个结构:

typedef struct {
    char  IP[12] ;
    int port;
    int slave [50] ;
} GW_t ;

在执行代码时出现错误分段错误 这个函数读取配置

int readConfig(int gw_nbr)
{
    char tmpBuff[8];
    char chaine [50] ; 
    config_t cfg;
    const char * l_nbre = NULL;
    const char * l_chaine = NULL;
    
    
    config_init(&cfg);
    printf("hello");
    //printf("\r\n========================== READING FROM CONFIG FILE ==========================\r\n");
    
    if (!config_read_file(&cfg, CONFIG_FILENAME)) {
        
        fprintf(stdout, "Configuration file not found!");
        config_destroy(&cfg);
        return -1;
    }

  printf ("read config file");
    if (!config_lookup_string(&cfg, "nbre_GW", &l_nbre)) {
        fprintf(stdout, "No 'nbre_GW' setting in configuration file.\r\n");
        config_destroy(&cfg);
        return -1;
    }
  
   gw_nbr = atoi(l_nbre);
   
    gwArray = (GW_t *) malloc (gw_nbr* sizeof(GW_t)) ;

    for (int i =1 ; i<= gw_nbr ; i++)
    {
        sprintf(tmpBuff,"GW%d",i);
        if (!config_lookup_string(&cfg, tmpBuff, &l_chaine)) {
            fprintf(stdout, "No 'GW' setting in configuration file.\r\n");
            config_destroy(&cfg);
            return -1;
        }
        
        strcpy(chaine, l_chaine);
        
        int len = strlen(chaine);
        
        char d[] = ";";
        printf ("first strtok");
        char *p = strtok(chaine, d);
        
        strcpy(gwArray[i].IP,p);
        
        p = strtok(NULL, d);
        gwArray[i].port = atoi(p);
        int j =0 ;
        while(p != NULL)
        {
            p = strtok(NULL, d);
            gwArray[i].slave[j] = atoi(p);
            j++ ;
        }

    }

 }

【问题讨论】:

  • char IP[12] ; 还是太小了。
  • 除了@wildplasser 注释之外,考虑到 C 字符串还存储 '\0' 字符,因此您的示例实际上需要 char IP[13] 符号。考虑到诸如“255.255.255.255”之类的 IP 地址的极端情况,您需要 16 个字符来存储它。
  • for (int i =1 ; i&lt;= gw_nbr ; i++) gwArray[0] 中)
  • 什么是config_lookup_string?您可以链接到 repo 以便我们可以下载并尝试运行代码吗?您是否尝试过在调试器中运行它,或者使用 Address Sanitizer?

标签: c ubuntu segmentation-fault config


【解决方案1】:

这段代码有几个问题:

  1. 你在gwArray中分配了三个项目(因为nbre_GW是3)。
  2. 您让 gwArray[0] 保持原样,其中包含垃圾(calloc 将内存归零,但 malloc 不会)。
  3. 您写信给gwArray[3],它从未被分配。
  4. 函数返回 -1 表示错误,但返回垃圾表示成功。

因此,当程序试图解释 gwArray[0] 中的垃圾,或者读取被 gwArray[3] 覆盖的任何内容时,或者当它试图处理垃圾数量的网关时,程序可能会崩溃。如果不在调试器中运行整个程序,则无法判断,但这很可能是这些原因之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 2020-08-14
    • 2018-03-11
    相关资源
    最近更新 更多