Warm tip: This article is reproduced from serverfault.com, please click

pointers-结构分割错误

(pointers - C struct Segmentation fault)

发布于 2020-11-30 14:39:15

输入第二个元素后,它将我丢掉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);       
    
}
Questioner
Aaron7
Viewed
0
Adrian Mole 2020-11-30 22:57:17

*(nr)++;语句中的括号实际上没有任何作用(你只是包装了nr变量的名称);因此,此语句的作用是增加指针的值-这将在第二个(和后续)循环中引起问题,因为该循环随后将指向无效位置。这是因为后递增(++)运算符的优先级高于间接调用(*)运算符的优先级

实际上,启用完全警告后,你的编译器很可能会发现此问题。例如,clang-cl给出:

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

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