【问题标题】:Declaring array and printing [BUG?]声明数组并打印 [BUG?]
【发布时间】:2019-03-03 13:27:21
【问题描述】:

这可能是一个菜鸟问题,但我仍然很困惑为什么会发生这种情况。 所以这段代码工作得很好:

int *m,g;
    g=1;
    m[0]=1;
    cout<<m[0];

这个报错:

int *m;
    m[0]=1;
    cout<<m[0];

这可能是一个错误吗?

【问题讨论】:

  • 是的,这是您代码中的错误。这是未定义的行为,因为指针尚未初始化。
  • 您能否更具体一点,为什么它在第一种情况下有效?
  • int* m; 然后m[0]=1 是一个错误。对m[any index]的任何其他访问也是如此。
  • 为什么它在第一种情况下有效?不幸的是,未定义的行为有时会返回您期望的结果。但是,您根本不能指望它,即使您更改程序中不相关的行,它也可能在另一台计算机或同一台计算机上失败。
  • 感谢您的帮助

标签: c++ arrays codeblocks element


【解决方案1】:

你正在使用一个未初始化的数组并且你试图访问它导致你一个未定义的行为

按照标准

如果没有为对象指定初始化器,则该对象是 默认初始化。当使用自动或 获取动态存储时长,对象有一个不确定的 值,并且如果没有对对象执行初始化,则 对象保留一个不确定的值,直到该值被替换... 如果评估产生不确定的值,则行为 未定义

你之前应该这样初始化

int *m=new int[size_you_want_give_to]

例如

int *m=new int[5]; // array of 5 elements 

【讨论】:

  • 但为什么它在第一种情况下有效?在第二种情况下,我刚刚删除了 g=1 并且它不起作用
  • 这就是未定义的行为意味着它可能会起作用它可能不会在您的计算机内部执行其他操作,这就是为什么在您的代码中包含它太危险了
  • 你可以在这里阅读更多信息:geeksforgeeks.org/undefined-behavior-c-cpp
猜你喜欢
  • 2017-02-16
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多