【问题标题】:Is it okay to initialize a pointer to "point" at NULL first than make it point at an array later?是否可以先在 NULL 处初始化指向“指向”的指针,而不是稍后将其指向数组?
【发布时间】:2021-07-18 11:49:46
【问题描述】:

我有一个结构体,其中包含一个值和对该类型的另一个结构体的引用。

struct mystruct { int val; mystruct* next; };

然后我初始化了一个像struct mystruct* ptr=NULL; 这样的指针。这个指针应该稍后指向一个结构数组。我相信做 malloc(sizeof(struct)); 会更聪明。 和免费(结构);稍后。但它似乎无论如何都有效,但它似乎不正确。我想改变它,我很难向自己解释为什么。有什么假设吗?

【问题讨论】:

  • 是的,没关系,但最好发布您的示例代码以使您的问题更加清晰。
  • 按照上述人的方式发布您的代码尝试/示例。但是从你写的内容来看,free(struct); 是错误的,因为 struct 不是指针,你需要使用 free(ptr); 释放指针
  • 这就像和你的女朋友在珠宝店里一样:你可以指向任何东西(包括什么都没有),你可以随时重新决定你指向的东西。只有当你真正想要抓住你所指的东西时,你才需要非常小心地考虑可能的结果;)

标签: c pointers


【解决方案1】:

给任何对象一个初始值并稍后将其设置为另一个值是“可以的”。但是,一切都取决于情况。给对象一个不打算使用的初始值是一种保护由错误引起的问题的方法,在该错误中,对象的值在被赋予所需的值之前就被使用了。一些对象可以初始化为一个值,虽然不是所需的值,但可能比让对象未初始化造成的危害更小。

对于指针,空指针通常是这样的值:在许多系统中,试图解除对空指针的引用会导致程序陷入陷阱。这将揭示错误并防止程序做其他错误的事情,这可能被认为是比替代方案更好的结果,这可能包括程序继续执行并产生不正确的结果或将不正确的结果写入存储,可能会删除好的数据。这种防范错误的解决方案是否物有所值,视情况而定。

如果安全性很重要,但并不重要,那么为对象赋予一个可以最大限度减少伤害的初始值是防止更严重的程序不当行为的合理防范。

如果安全至关重要,则应使用已知良好的值初始化对象,或者应证明该对象在使用前将被赋予良好的值。

如果性能至关重要而安全性不是那么重要,则对象可能会在被赋予值之前保持未初始化状态。

如果您在学习练习或其他学生项目中这样做,那么请练习这两种方法,看看哪种方法对您更有用。如果您的程序在使用初始化为 NULL 的指针后立即崩溃,或者如果在未初始化的指针导致其他问题之前继续执行一段时间,您的程序是否更容易调试?

【讨论】:

  • 这听起来很合理,因为它听起来很有趣。我实际上是在为一个朋友编写这个代码,它是实验性的。安全可能是未来的一个问题。所以我会这样做:我测试是否有足够的内存,将指针设置为 NULL,一旦相当大的数组被初始化,我会让它们指向第一个数组的第一个索引.但非常感谢您的建议和时间。希望您在这个美好的星期六度过余下的时光!
猜你喜欢
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
相关资源
最近更新 更多