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

C++ C++;代码在Ubuntu上不起作用,c++,ubuntu,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++) { trt

我的代码在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;
}
如果您将注释部分包括在内,u将只接收分段错误(堆芯转储)


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

此代码有一些问题,所以我只能猜测您想要实现什么

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

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

分配int指针数组的正确方法是
int**trtrtr=newint*[n]
。请注意,我不需要强制转换,我使用了type
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;
}
#包括
整数**lol(整数*a,整数n,整数m)
{
int**trtrtr=新的int*[n];
对于(int i=0;i>n>>m;
int*a=新的int[n*m];
对于(int i=0;istd::请学习如何为您的问题(和标签)设置合理的标题。为什么要将
new int[]
的结果转换为错误的类型?最初我使用了(int***)malloc()和(int**)malloc()但是我也有同样的问题,然后我把它改成了这个为什么这甚至是一个三重指针?根本没有理由使用第三级间接寻址。另外,如果您只使用
std::vector
的话,事情会变得更容易阅读(并消除代码中的所有内存泄漏)您应该使用
g++-Wall-Wextra-g try.cpp-o try
进行编译,然后改进代码以不获得警告,然后感谢它现在可以工作了。我需要在那里使用三个指针,以便将它分配给具有int a[]的相同内存空间。所以我只是再次将其更改为***lol。但它可以工作)错误在这里新int*[n];只是不知道如何正确使用它,所以我铸造)现在我知道了)
#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;
}