我有这个代码在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,它可以正常工作。
答案 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;
。你应该尽量避免这种情况。)