C struct 分段错误
Posted
技术标签:
【中文标题】C struct 分段错误【英文标题】:C struct Segmentation fault 【发布时间】: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);
【问题讨论】:
【参考方案1】:*(nr)++;
语句中的括号实际上实现了 nothing(您只是简单地包装了 nr
变量的名称);因此,该语句的效果是增加 pointer 的值 - 这将导致第二个(和后续)循环出现问题,因为它将指向一个无效的位置。这是因为后自增 (++
) 运算符比间接 (*
) 运算符具有 higher precedence。
事实上,启用完整警告后,您的编译器很可能会发现这个问题;例如,clang-cl 给出:
警告:表达式结果未使用 [-Wunused-value]
要解决此问题,您需要将解引用运算符 (*
) 放在 括号内,如下所示:(*nr)++
。
【讨论】:
以上是关于C struct 分段错误的主要内容,如果未能解决你的问题,请参考以下文章