结构和指针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;
您已经声明了两个指针,s1
和 s2
但它们还没有指向任何地方!您需要使用 new
为这些指针分配内存。
s1 = new Structure1();
s1->c = 'a';
s1->i = 1;
// ...
之后不要忘记删除内存:
delete s1;
请参阅此答案,为什么new Structure1()
中的括号会有所不同。另外,请注意,还有其他方法可以获取指向对象的指针,例如使用 &
运算符,但在这种特殊情况下,我认为您想要分配内存。
指针是内存中指向另一个对象的对象。使用间接寻址运算符时,它会导致指针被取消引用。例如,这个:
s1->c;
与以下相同:
(*s1).c;
取消引用指针时,它将返回对指针指向的对象的引用。如果没有它指向的对象(或它指向nullptr
(,则引用它会给你的程序未定义的行为。
解决方案是在堆上创建一个类的新实例,并返回指向它的指针。这就是new
所做的:
Structure1 *structp = new Structure1();
一旦你意识到指针不是实际的对象,它们只是内存地址,它就有意义了。如果您不分配空间或为其分配内存地址,它将保持未初始化状态并被垃圾填充。就像常规对象一样,为什么要使用初始化的指针?
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错