C struct 段错误

标签 c pointers struct segmentation-fault malloc

进入第二个元素后,它把我扔出去 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);       
    
}

最佳答案

您的 *(nr)++; 中的括号语句实际上什么也没做(您只是包装了 nr 变量的名称);因此,该语句的作用是增加指针的值——这将在第二个(和后续)循环中引起问题,因为它将指向无效位置。这是因为后增量 ( ++ ) 运算符具有 higher precedence比间接( * )运算符。
事实上,在启用完整警告的情况下,您的编译器很可能会发现这个问题;例如,clang-cl 给出:

warning : expression result unused [-Wunused-value]


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

关于C struct 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65075592/

相关文章:

c++ - C中的返回地址

C:动态数组和指针数组创建段错误

c - 使用节点地址的链表大小

c - 错误 : positional initialization of field in ‘struct’ declared with ‘designated_init’ attribute [-Werror=designated-init]

c - 函数头说明

c - 为什么我不能使用 "fgets"将字符串读取到我的结构元素中?

c - 函数中指向动态分配的结构数组的指针是否有帮助?

c - 为什么编译器在使用结构变量时显示 "Type specifier missing"

凯撒密码不适用于空格

c++ - line 是什么意思?