[英]declare a static array as pointer in c++
这是我最近看到的几行C ++代码。
double a[p][p];
for(i=0;i<p;i++)
{
for(j=0;j<p;j++)
{
a[i][j] = m[i][j]; //m is sth we are given.
}
}
dgeev_(&jobvl,&jobvr,&p,(double*)a,&lda,(double*)wr,(double*)wi,(double*)vl,
&ldvl,(double*)vr,&ldvr,(double*)work,&lwork,&info);
// sth else..
dgeev_
是一个函数,您可以在这里找到其文档: http : //www.netlib.org/clapack/old/double/dgeev.c
dgeev_
是通过以下方式在标头中声明的,因此我们可以在C ++代码中使用C函数。
extern "C" {
void dgeev_(char*, char*, int*, double*, int*, double*, double*, double*,
int*, double*, int*, double*, int*, int*);
}
如我们所见, a
是静态数组, dgeev_
需要第四个参数的类型为doublereal *
的变量。
(double*)a
在这里做什么?
这是一个错误,或者是作者在骗你。
他使用的C样式转换到“黑客”的值a
进double*
类型,从而使二维数组可以作为一维数组处理。 ( doublereal
只是double
的别名 。)
问题是, a
不是 double*
,也不是实际上可以转换为double*
。 我不知道它可以转换成什么,因为VLA仅在C ++中作为GCC扩展提供; 没有标准的措辞可以参考。 我将仅得出结论,该程序具有未定义的行为(尽管由于这些内容实际上是在内存中布置的,所以它似乎可以工作)。
如果作者希望能够使用一维索引安全地读取此数组,那么他应该以这种方式声明它(可以选择在数据存储顶部提供2D索引的错觉 )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.