【发布时间】:2021-05-24 23:42:13
【问题描述】:
我是一名尝试学习 C 的初学者。以下代码在我运行时出现分段错误。谁能解释原因,或者告诉我我的错误?
struct frac sum(struct frac f1, struct frac f2);
struct frac {
int *numer;
int *denom;
};
struct frac sum(struct frac f1, struct frac f2) {
struct frac rv;
*rv.numer = (*f1.numer)*(*f2.denom) + (*f2.numer)*(*f1.denom);
*rv.denom = (*f1.denom)*(*f2.denom);
return rv;
}
int main() {
int n = 5;
int d = 10;
struct frac myFrac1 = {&n, &d};
struct frac myFrac2 = {&n, &d};
struct frac myFrac3 = sum(myFrac1, myFrac2);
return 0;
}
【问题讨论】:
-
你为什么在这里使用指针?
rv.numer和rv.denom未初始化为任何内容,因此取消引用它们是未定义的行为。 -
好的,我从 rv.numer 和 rv.denom 中删除了 *,但现在我得到 警告:从 'int' 对 'int *' 的赋值使得指针从整数而不进行强制转换。 如果我尝试将表达式的右侧转换为
rv.denom =(int *) ((*f1.denom)*(*f2.denom));之类的指针,我会收到 警告:从不同大小的整数转换为指针。 -
因为您使用的是指针。您要么需要将
rv.numer和rv.demon指向某物(例如malloc调用的结果或指向现有 int 的指针,就像您在main中对其他两个对象所做的那样),或者使numer和denomints 而不是指针。 -
所以我首先需要为
rv.numer和rv.denom分配内存,然后才能让它们指向指针上的一些算术结果? -
请不要编辑您的原始帖子以更改代表您问题本质的内容。编辑应仅限于格式化和/或添加新信息以澄清 cmets 中的问题。更改代码会导致新查看者感到困惑,并导致已通过 cmets 提供的内容和答案被误解。出于这个原因,我已将帖子回滚到原来的位置。
标签: c pointers struct segmentation-fault