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