繁体   English   中英

在C ++中将静态数组声明为指针

[英]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样式转换到“黑客”的值adouble*类型,从而使二维数组可以作为一维数组处理。 doublereal只是double的别名 。)

问题是, a 不是 double* ,也不是实际上可以转换为double* 我不知道它可以转换成什么,因为VLA仅在C ++中作为GCC扩展提供; 没有标准的措辞可以参考。 我将仅得出结论,该程序具有未定义的行为(尽管由于这些内容实际上是在内存中布置的,所以它似乎可以工作)。

如果作者希望能够使用一维索引安全地读取此数组,那么他应该以这种方式声明它(可以选择在数据存储顶部提供2D索引的错觉 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM