繁体   English   中英

结构和指针C ++

[英]Struct and Pointers C++

我正在下面的代码中尝试使用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;
}
structp s1, s2;

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

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

不要忘记随后删除内存:

delete s1;

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

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

s1->c;

是相同的:

(*s1).c;

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

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

 Structure1 *structp = new Structure1(); 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM