我想使用malloc()
返回的指针作为多维数组的名称,因此我转换了指针。编译时,我收到一个错误:
clang++ -o cast cast.cpp
cast.cpp:29:12: error: assigning to 'int8_t (*)[width]' from incompatible type
'int8_t (*)[width]'
int8line = (int8_t (*)[width])(array);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
但是在Linux上的同一平台(OS X)和icpc
上使用g++/icpc
进行编译,不会引发任何错误。
更新:宽度是可变的,因此不能是const
。
经过测试的编译器是:
Mac OS X
icpc (ICC) 17.0.4 20170411 clang --version Apple LLVM version 8.1.0 (clang-802.0.42) Target: x86_64-apple-darwin16.6.0 Thread model: posix
Linux 2.6.32:
icpc (ICC) 14.0.0 20130728 g++ (GCC) 4.4.6 20110731
结果应为:
icpc -std=c++11 -o cast cast.cpp && ./cast 5
0 1 2 3 4
5 6 7 8 9
0 1 2 3 4
5 6 7 8 9
最小可编辑代码(已更新):
#include <iostream>
#include <cstdint>
using namespace std;
int main(int argc, char* argv[])
{
if (argc != 2)
{
cerr << "needs one argument\n";
exit(EXIT_FAILURE);
}
long width = atol(argv[1]);
int8_t *array = static_cast<int8_t(*)>(malloc(sizeof(int8_t)*2*width));
for (int i = 0; i < 2*width; i++)
array[i] = i;
for (int j = 0; j < 2; j++)
{
for (int i = 0; i < width; i++)
{
cout << static_cast<int>(array[i+j*width]);
if (i < (width-1))
cout << '\t';
}
cout << '\n';
}
cout << '\n';
int8_t (*int8line)[width];
int8line = (int8_t (*)[width])(array);
for (int j = 0; j < 2; j++)
{
for (int i = 0; i < width; i++)
{
cout << static_cast<int>(int8line[j][i]);
if (i < (width-1))
cout << '\t';
}
cout << '\n';
}
free(array);
exit(EXIT_SUCCESS);
}
答案 0 :(得分:1)
我相信这是因为它是常规的非常数变量。其他编译器可能会识别此变量的不变性,但这种猜测不是标准规定的。
如果使变量width
保持不变,它应该可以工作:
const long width = 5;
答案 1 :(得分:0)
拥有非constexpr width
称为varaible length array,而不是标准C ++。
int8line
的类型因此处于奇怪状态,int8_t (*)[width]
不是实际类型,导致编译器产生令人困惑的错误消息。
作为Zbynek Vyskovsky - kvr000 pointed out,使用const long width = 5
将起作用,这是因为它使width
成为常量表达式,这在编译时是已知的。这使得数组不是可变长度数组。
您应该使用std::vector
代替。