C ++代码不适用于Ubuntu

时间:2018-01-16 13:33:52

标签: c++ ubuntu

我有这个代码在Visual Studio中没有任何错误运行但在Ubuntu上没有我通过终端(g++ try.cpp -o try)编译它。也许你可以找出原因?

#include <iostream>
using namespace std;
int ***lol(int *a, int n, int m)
{
    int ***trtr = (int ***)new int[n];
    for (int i = 0; i < n; i++)
    {
        trtr[i] = (int **)new int[m];
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            trtr[i][j] = &a[i * m + j];
        }
    }
    // for (int i = 0; i < n; i++)
    // {
    //         for (int j = 0; j < m; j++)
    //         {
    //                 *trtr[i][j] = a[i * m + j];
    //         }
    // }
    return trtr;
}
int main()
{
    int n, m;
    cin >> n >> m;
    int *a = new int[n * m];
    for (int i = 0; i < n * m; i++)
        a[i] = i;
    int ***kekl = lol(a, n, m);
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cout << *kekl[i][j] << " ";
        }
        cout << endl;
    }
    //system("pause");
    return 0;
}

输入示例:10 10

Output: 36495648 36495688 36495728 36495768 0 36495772 0 36495784 0 36495788 
0 36495784 0 36495788 0 36495792 0 36495804 0 23 
0 36495804 0 23 24 25 30 31 32 33 
30 31 32 33 34 35 40 41 42 43 
40 41 42 43 44 45 50 51 52 53 
50 51 52 53 54 55 56 57 58 59 
Segmentation fault (core dumped)

如果您将包含注释部分,您将只收到Segmentation fault(core dumped)

在Visual Studio中再次使用Windows,它可以正常工作。

1 个答案:

答案 0 :(得分:2)

此代码存在一些问题,因此我只能猜测您想要实现的目标。

这里最有问题的是int ***trtr = (int ***)new int[n];

我想你想在这里分配一个二维的int数组。所以你需要为n个指向int数组的指针分配空间。 你要做的是分配一个大小为n的int数组,你将其转换为int***。随后对trtr的访问会导致未定义的行为,这可能导致MS Windows上的行为与Ubuntu上的行为不同。 “未定义的行为未定义。”

分配int指针数组的正确方法是int **trtr = new int*[n]。请注意,我不需要演员,我使用了int*类型。

您要编写的代码可能是:

#include <iostream>

int **lol(int *a, int n, int m)
{
    int **trtr = new int*[n];
    for (int i = 0; i < n; i++)
    {
        trtr[i] = new int[m];
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            trtr[i][j] = a[i * m + j];
        }
    }
    // for (int i = 0; i < n; i++)
    // {
    //         for (int j = 0; j < m; j++)
    //         {
    //                 *trtr[i][j] = a[i * m + j];
    //         }
    // }
    return trtr;
}

int main()
{
    int n, m;

    std::cin >> n >> m;

    int *a = new int[n * m];

    for (int i = 0; i < n * m; i++)
        a[i] = i;

    int **kekl = lol(a, n, m);

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            std::cout << kekl[i][j] << " ";
        }
        std::cout << std::endl;
    }

    //system("pause");
    return 0;
}

(我也删除了using namespace std;。你应该尽量避免这种情况。)