【问题标题】:Dynamically allocated array in C++C++中动态分配的数组
【发布时间】:2014-07-12 05:12:21
【问题描述】:

我正在玩在 C++ 中动态分配数组。我有这个代码

#include <iosteam>
using namespace std;

void A(int* arr)
{
    for(int i = 0; i < 10; i++)
        cout << arr[i] << endl;
}

int main()
{
    int **nums;
    nums = new int*[10];
    for(int i = 0; i < 10; i++)
        nums[i] = new int(i);

    for(int i = 0; i < 10; i++)
        cout << *nums[i] << endl;

    cout << endl;
    A(*nums);
    return 0;
}

这给了我输出

0
1
2
3
4
5
6
7
8
9

0
0
0
0
0
0
33
0
1
0

我的问题是:当数组传递给函数 A(int* arr) 时,为什么打印在那里的数组的输出与 main() 中定义的数组的输出不同?我一直在研究动态分配和双指针,但我似乎无法弄清楚这一点。我已经搜索了 SO 问题,但找不到该问题的合适答案。我想知道我是否可以在函数 A() 中打印数组的值,或者是否可以这样做。任何帮助表示赞赏。

【问题讨论】:

    标签: c++ dynamic-arrays


    【解决方案1】:

    你的功能:

    void A(int* arr)
    {
        for(int i = 0; i < 10; i++)
            cout << arr[i] << endl;
    }
    

    A(*nums)调用。

    你正在有效地执行:

    for(int i = 0; i < 10; i++)
            cout << (*nums)[i] << endl;
    

    相当于:

    for(int i = 0; i < 10; i++)
            cout << nums[0][i] << endl;
    

    您正在看到未定义行为的影响,因为您正在访问未经授权的内存。

    请记住,您只能访问

    num[0][0]
    num[1][0]
    
    ....
    
    num[9][0]
    

    而不是

    num[0][0]
    num[0][1]
    
    ....
    
    num[0][9]
    

    【讨论】:

    • 所以如果我想在 A(int* arr) 中打印数组,我该怎么做呢?或者有可能做到吗?
    • @jmh:这是不可能的,因为函数A 只收到了一个int*。由于您的数据是使用new int(i) 单独分配的,因此它们不是连续的,您无法从第一个元素中找到其他元素。您可以做的是将int* 的数组作为int** 类型传递,并以与main 中相同的方式访问。
    • @BenVoigt 谢谢!这就是我想要实现的目标。
    【解决方案2】:

    上面的答案很对,你可以修改你的代码如下。

    void A(int** arr)
    
    {
    
        for(int i = 0; i < 10; i++)
           // cout << *arr[i] << endl; or bellow
            cout <<arr[i][0]<<endl;
    }
    

    在您的主目录中引用为“A(nums)”;

    【讨论】:

    • 感谢您的回答。我检查了这个,它肯定也有效。
    猜你喜欢
    • 2010-10-02
    • 2014-08-19
    • 2021-11-24
    • 2022-11-25
    • 2023-03-17
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2021-07-17
    相关资源
    最近更新 更多