1

我正在下面的代码中尝试使用 Struct、指针和 typedef。我想创建一个指向我组成的结构的指针。然后我想使用 -> 运算符来操作结构的成员。

下面的代码编译得很好,但是,当我运行程序时,它会产生分段错误。

有人可以帮忙解释我的逻辑哪里出错了吗?

谢谢你。

struct Structure1 {
char c;
int i;
float f;
double d;
};

typedef Structure1* structp;

int main(){
structp s1, s2;
s1->c = 'a';
s1->i = 1;
s1->f = 3.14;
s1->d = 0.00093;
s2->c = 'a';
s2->i = 1;
s2->f = 3.14;
s2->d = 0.00093;
}
4

2 回答 2

4
structp s1, s2;

您已经声明了两个指针,s1s2它们还没有指向任何地方!您需要使用 为这些指针分配内存new

s1 = new Structure1();
s1->c = 'a';
s1->i = 1;
// ...

之后不要忘记删除内存:

delete s1;

请参阅此答案,为什么括号中的括号new Structure1()会有所不同。另外,请注意,还有其他方法可以获得指向对象的指针,例如使用&运算符,但在这种特殊情况下,我认为您想要分配内存。

于 2013-07-12T01:11:19.610 回答
2

指针是内存中指向另一个对象的对象。使用间接运算符时,它会导致指针被取消引用。例如,这个:

s1->c;

是相同的:

(*s1).c;

当您取消引用指针时,它会返回对它所指向的对象的引用。如果没有它指向(或它指向nullptr)的对象,则将其推迟会给您的程序Undefined Behavior

解决方案是在堆上创建一个类的新实例并返回一个指向它的指针。这就是new

Structure1 *structp = new Structure1();

一旦您意识到指针不是实际的对象,它们只是内存地址,就有意义了。如果您不分配空间或为其分配内存地址,它将保持未初始化状态并被垃圾填充。就像普通对象一样,为什么要使用初始化指针?

于 2013-07-12T01:21:04.403 回答