gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:30:40 24 4
gpt4 key购买 nike

这是我最近看到的几行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_在header中声明如下,所以我们可以在C++代码中使用C函数。

extern "C" {
void dgeev_(char*, char*, int*, double*, int*, double*, double*, double*,
int*, double*, int*, double*, int*, int*);
}

我们可以看到,a是静态数组,dgeev_需要一个类型为doublereal *的变量作为第4个参数。

(double*)a 在这里做什么?

最佳答案

这要么是一个错误,要么是作者在耍你。

他使用 C 风格的转换将值 a 转换为 double* 类型,这样一个二维数组就可以被当作一个单一的维数组。 ( doublereal is just an alias for double .)

问题是,a 不是 double*,它实际上也不能转换为 double*。我不知道它可以转换成什么,因为 VLA 只能在 C++ 中作为 GCC 扩展使用;没有标准的措辞可供引用。我将得出结论,该程序具有未定义的行为(尽管它可能看起来有效,因为这些东西实际上是如何在内存中布局的)。

如果作者希望能够使用单维索引安全地读取此数组,他应该以这种方式开始声明(可选择在数据存储)。

关于c++ - 在 C++ 中将静态数组声明为指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43746581/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com