【问题标题】:Bus error in printf for printing the member of structure用于打印结构成员的 printf 中的总线错误
【发布时间】:2021-11-04 12:46:01
【问题描述】:
struct abc
{
    float b;
};

abc* xyz;

xyz->b = 10;
printf("%f", xyz->b);

printf 出错。 是什么原因? 我该如何解决这个问题?

【问题讨论】:

  • 你忘记为 xyz 分配内存
  • 您的指针xyz 未初始化。谁知道它指向哪里(但使用它值得一个总线错误或分段错误)。
  • 这里不需要使用指针。只需使用abx xyz; xyz.b=10;...
  • @ChrisMM 那也是 :),C++ 代码无论如何都应该有最少的新/删除数
  • 读取未初始化的指针,例如您的xyz 会导致未定义的行为。

标签: c++


【解决方案1】:

你需要定义一个结构实例。

abc *xyz 只定义了一个指针,它不为struct abc 的实例分配内存(静态或动态)。因此变量float b 没有分配空间。

解决方案:

abc xyz;
xyz.b=10;

或者

abc *xyz = new abc;

【讨论】:

  • malloc 在工作时已经够麻烦了,但在你的例子中,it does not compile
  • 我认为它更像是“定义或创建”而不是“声明”,但除此之外是的,除了在 C++ 问题中思考 C 的失误。
  • 在 c++ 中使用 new 而不是 malloc 并且不要使用 new 除非你真的必须这样做
  • 我喜欢您提供的非指针替代方案。如果您解决了 cmets 中提到的问题,我将很乐意投票。如果你改进你的大写和换行,那就更开心了。
  • 感谢大家告诉我,按照您的建议进行了更改
【解决方案2】:

在代码中:

#include <iostream>

struct abc
{
    float b = 0.0f; // initialize!
};

int main()
{
    abc* xyz = new abc{}; // <-- new!
    // or use auto xyz = std::make_unique<abc>(); <-- recommended for c++

    xyz->b = 10.0f; 
    std::cout << xyz->b;
    // printf("%f", xyz->b); <-- std::cout is more 'c++'

    delete xyz;
}

【讨论】:

  • newstd::make_unique 同样是 C++ 风格。一个简单地使用常规指针,另一个 – 智能指针。
  • make_unique 确实是当今推荐的方式,C++ 不断发展,每个版本都添加了更好的东西。与 new 不同,make_unique 显示意图(谁“拥有”指针),具有更好的异常安全性(传递中间体),与 RAII 等交互等等。所以 new 是 C++ stackoverflow.com/questions/37514509/… 和后续链接
  • 在很多情况下智能指针肯定更好。然而,在许多情况下,原始指针仍然在起作用。您的陈述对于已弃用的auto_ptr 是正确的。说原始指针通常不是 [现代] C++ 风格是不正确的。
  • 我更新了我的声明,新的是 C++,是的,原始指针很多。那是因为我们有遗留代码并且书籍尚未更新。我花了 30 多年的时间不得不用 new/delete 调试人们的代码,有了新的智能指针,错误的数量大大减少了。所以是的,我说他们是推荐的。
  • 好的。编辑让事情变得更好。感谢您考虑。
【解决方案3】:

一种可能的解决方案是更改: abc *xyz; 进入 abc *xyz = new abc();

崩溃的原因是您没有为abc::b 分配任何实际内存,因此xyz 是一个未初始化的指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2013-06-19
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 2021-11-22
    相关资源
    最近更新 更多