C++代码在 Ubuntu 上不起作用

C++ code does not work on Ubuntu

本文关键字:不起作用 Ubuntu 代码 C++      更新时间:2023-10-16

我有这段代码在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)

如果您将包含注释部分,则只会收到分段错误(核心转储(

再在Visual Studio的Windows上再一次,它工作正常。

这段代码有一些问题,所以我只能猜测你想要实现什么。

这里最有问题的是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;.你应该尽量避免这种情况。