gpt4 book ai didi

c - 尝试在 C 程序中声明 5D 数组时出现段错误

转载 作者:行者123 更新时间:2023-11-30 16:19:19 24 4
gpt4 key购买 nike

我正在将程序从 fortran77 转换为 C 编程语言,在 fortran 程序中声明了一个 5D 数组,如下所示,并且代码编译和执行良好。但是,当我将相同的代码转换为具有相同值的 C 代码时,C 代码可以编译,但会出现段错误。

如果这个问题是由于两种语言之间多维数组内存分配的标准布局不同,我在用 C 声明数组时尝试了所有维度组合,并且在所有情况下它也会给出“段错误”。

我也厌倦了下面显示的“calloc”技术,它可以工作,但我不知道如何为全局声明的数组赋值。

注意:段错误发生在声明步骤(即程序在那里停止)

所以基本上我的问题是:- 为什么它在 fortran 中有效但在 C 中无效?,并且,- 如何在 C 中解决这个问题?

 ! Fortran77 Code
parameter (i2maxbin=38)
parameter (imaxbin=20)
parameter (Nid=10)
real*8 dNdpt(Nid,i2maxbin,imaxbin,imaxbin,imaxbin)
<小时/>
 /* C Code */
const int i2maxbin = 38;
const int imaxbin = 20;
const int nID = 10;
double dNdpt[nID][i2maxbin][imaxbin][imaxbin][imaxbin];

/* Declaring using calloc */
double (*dNdpt)[nID][i2maxbin][imaxbin][imaxbin][imaxbin] =
calloc(sizeof(*dNdpt), 38);

for(int i = 0; i < nID; i++)
{
for(int j = 0; j < i2maxbin; j++)
{
dNdpt[i][j][0][0][0] = 12.22673423;
}
}

When executing it gives me this error

error: assignment to expression with array type
dNdpt[i][j][0][0][0] = 12.22673423;
^

最佳答案

以下建议代码:

  1. 将数组放置在文件范围内而不是堆栈上
  2. 干净地编译
  3. 避免使用动态内存分配/释放
  4. 干净地运行和退出,不会崩溃
  5. 避免使用 VLA

现在建议的代码:

#define i2maxbin  38
#define imaxbin 20
#define nID 10



double dNptr[nID][i2maxbin][imaxbin][imaxbin][imaxbin];


int main( void )
{
for(int i = 0; i < nID; i++)
{
for(int j = 0; j < i2maxbin; j++)
{
dNptr[i][j][0][0][0] = 12.22673423;
}
}
}

关于c - 尝试在 C 程序中声明 5D 数组时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55657241/

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