C++ C++;代码在Ubuntu上不起作用
我的代码在visual studio中运行时没有任何错误,但在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
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]
。请注意,我不需要强制转换,我使用了typeint*
您想要编写的代码可能是:
#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;i std::请学习如何为您的问题(和标签)设置合理的标题。为什么要将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;
}