【问题标题】:C struct Segmentation faultC struct 分段错误
【发布时间】:2021-03-12 11:52:07
【问题描述】:

输入第二个元素后,它把我抛出 x。我知道为每个元素分配内存是不合适的,但我想更好地检测错误。我想保存两个我事先不知道大小的字符字段。

typedef struct
{
    char *m_Cislo;  
    char *m_Jmeno;
} TSEZNAM;

TSEZNAM * readNumbers (int *nr)
{   
    char *str = NULL;
    size_t  capacity = 0;

    TSEZNAM st;
    TSEZNAM *res = NULL;
    *nr=0;
    
    while ( getline(&str, &capacity, stdin) != -1 )
    {

        st.m_Jmeno = malloc(sizeof(char)*capacity);
        st.m_Cislo = malloc(sizeof(char)*capacity);
        
        sscanf(str,"%s %s", st.m_Cislo, st.m_Jmeno);

        TSEZNAM *tmp = (TSEZNAM*) malloc ((*nr+1)*sizeof(*res));

        for(int i=0; i < *nr; i++)
            tmp[i] = res[i];
            
        free(res);
        res=tmp;

        res[*nr]=st;
        *(nr)++;
        
    }
    
    return res;
}

int main(void)
{
    int listNr;
    TSEZNAM *list = readNumbers(&listNr);       
    
}

【问题讨论】:

    标签: c pointers struct segmentation-fault malloc


    【解决方案1】:

    *(nr)++; 语句中的括号实际上实现了 nothing(您只是简单地包装了 nr 变量的名称);因此,该语句的效果是增加 pointer 的值 - 这将导致第二个(和后续)循环出现问题,因为它将指向一个无效的位置。这是因为后自增 (++) 运算符比间接 (*) 运算符具有 higher precedence

    事实上,启用完整警告后,您的编译器很可能会发现这个问题;例如,clang-cl 给出:

    警告:表达式结果未使用 [-Wunused-value]

    要解决此问题,您需要将解引用运算符 (*) 放在 括号内,如下所示:(*nr)++

    【讨论】:

      猜你喜欢
      • 2012-12-22
      • 2020-11-21
      • 1970-01-01
      • 2020-02-28
      • 2017-04-19
      • 2021-10-31
      • 2018-10-13
      • 2011-02-13
      • 2016-07-16
      相关资源
      最近更新 更多