【问题标题】:Can someone explain the behavior of the output while returning an array from function?有人可以在从函数返回数组时解释输出的行为吗?
【发布时间】:2020-08-30 09:17:28
【问题描述】:

代码:

#include<iostream>

using namespace std;

int * arrayReturn();

int main(){
    
    for(int i=0; i<10; i++){
        cout<<"Value at "<<i<<": "<<arrayReturn()[i]<<endl;
    }
    
    return 0;
}

int * arrayReturn(){
    static int arr[] = {10,20,30,40};
    
    return arr;
}

输出:

问题: 任何人都可以评论代码的输出吗?为什么第 4 位的值是 4659536,而第 8 位和第 9 位的值为 -1 而不是 0?

注意:请避免建议更正代码(这只是一个测试代码),只提供输出的原因。

【问题讨论】:

  • 这些只是一些垃圾值,因为你要越界了。
  • 从一个只有四个元素的数组中打印十个元素你怎么看?那是一种未定义的行为,即垃圾。
  • ArrayReturn() 返回一个指向正好有四个元素的数组的第一个元素的指针。它实际上并没有返回一个数组。使用返回的指针main() 尝试打印该数组的十个元素,该数组已知只有四个元素。因此行为是未定义的。打印垃圾值是未定义行为的常见症状。在你的情况下,你得到的三个零值也只是偶然的。
  • @Peter 谢谢。一个后续问题。每次我执行程序时,它应该抛出一个不同的垃圾值,但我在这里得到了常量值。为什么?

标签: c++ arrays function


【解决方案1】:

我编译并执行了你的代码。

这是输出:

$ ./sample.o 
Value at 0: 10
Value at 1: 20
Value at 2: 30
Value at 3: 40
Value at 4: -346453624
Value at 5: 32646
Value at 6: -346453584
Value at 7: 32646
Value at 8: 6
Value at 9: 0

请注意从索引 4 开始的值。 他们是垃圾。

由于原始数组仅包含 4 个元素,因此如果不进入 Undefined Behaviour 领域,则无法真正超越第 4 个元素(第 3 个索引)。

每次执行代码时,可能会得到不同的值。

【讨论】:

  • 是的。它不能越界。每次运行都获得相同的垃圾值吗?
  • 人们永远不知道他们会从垃圾中得到什么价值。所有运行的值可能相同;或者它们可能不同。获得相同或不同的值并不意味着什么。一个人永远不能依赖它。
【解决方案2】:

输入数组仅用四个值初始化:10、20、30、40。“for”循环迭代 10 次。在 C++ 中,索引运算符会很高兴地返回它找到的任何位置的值,但在这种情况下,只有前四个值是有效的;以下所有值均无效。

【讨论】:

    猜你喜欢
    • 2016-03-14
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 2018-07-28
    • 2020-11-12
    • 2020-05-29
    相关资源
    最近更新 更多