为什么 C 样式数组的前两个元素是地址或来源不明的数据(对我而言)? [重复]

问题描述 投票:0回答:0

我正在尝试学习如何返回指向数组的指针,这样你就可以解决整个“你不能在 C/C++ 中返回数组”的问题。

我是 C++ 的初学者,但如果有帮助的话,我对 Java 了解很多。

我的代码是这样的:

// Source.cpp

#include <iostream>

// Returns a pointer to an array that contains the digits 0 to 9.
int* test()
{
    // Create the array.
    int r[10] = {0,1,2,3,4,5,6,7,8,9};
    
    // Return the address to the array.
    return r;
}

// Simple function that takes an "pointer" array or a "normal" array and prints the elements of them.
void print_arr(const int arr[], const int length)
{
    for (int i = 0; i < length; i++)
        std::cout << i << ": " << arr[i] << std::endl;
    
}


int main()
{
    // Test the printing function with an "normal" array containing the digits 0 to 9.
    print_arr(new int[10] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 10);
    // Insert a line break to make the output look more clean.
    std::cout << std::endl;
    // Print the "pointer" array that should contain the same as the temporary variable.
    print_arr(test(), 10);
}

我的输出是在 VS22 中默认的“调试”配置: (语言标准:ISO C++ 14,Windows SDK 版本:10.0,平台工具集:Visual Studio 2022 (v143))

0: 0
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9

0: 529054832
1: 32759
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9

我的输出是在 VS22 中默认的“Release”配置: (语言标准:ISO C++ 14,Windows SDK 版本:10.0,平台工具集:Visual Studio 2022 (v143))

0: 0
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9

0: 0
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9

我在 visual studio 中神奇地更改调试配置值时遇到了类似的问题。总的来说,我不知道这两种配置之间有什么区别。 我期待一般的 Visual Studio Coding 环境的一些提示 :).

我试着在第 10 行给“指针”数组添加 2 (

return r + 2;
) 的地址偏移量,这很有效,但当然这只改变了地址而不是内存中数组的内容,所以第二个 print_arr 的输出是从 2 到 9 的数字:

0: 2
1: 3
2: 4
3: 5
4: 6
5: 5
6: 8
7: 9
8: -858993460
9: -858993460

正如我所说,它“神奇地”(对我而言)通过更改为“发布”配置来工作。

c++ arrays pointers visual-c++
© www.soinside.com 2019 - 2024. All rights reserved.