arrays - Fortran 中零大小数组究竟发生了什么?

标签 arrays memory-management fortran

我看到了几个有关将未分配的数组传递到函数或子例程中的问题,这些问题会导致运行时错误,其中推荐的解决方案是在调用过程中以零长度分配它。我做了一些实验:

program test
   integer, allocatable :: A(:)

   allocate(A(3))
   print*, size(A)
   deallocate(A)

   allocate(A(-5:-3))
   print*, size(A)
   deallocate(A)

   allocate(A(0))
   A(0) = 9
   print*,A(0),'Size:',size(a)
   deallocate(a)

   allocate(A(-4))
   print*,size(A)
   deallocate(A)

   allocate(A(-4:-4))
   print*,size(A)
end  

第一个是显而易见的。长度为 3 的数组。第二个数组利用了 Fortran 的一项很酷的功能,定义您自己的索引限制。它是一个长度为 3 的数组,包含元素 A(-5)、A(-4) 和 A(-3)。

第三个变得危险。我用零分配它。我可以指定一个值!它打印:9 尺寸:0
第四个也打印出大小为零!

显然,分配长度为1、索引为-4的数组的正确方法是最后一个。

问题:在第三个和第四个变量上,我是否只是写入了可能属于其他变量的内存(当然这个示例没有其他变量)?

最佳答案

尝试定义和引用元素 A(0) 时,第三个片段无效。零大小的数组没有元素(否则它的大小不会为零) - 这包括不存在索引为零的元素。

第四个片段中没有这样的无效定义或引用。分配的数组再次具有零大小(这就是语言所说的当您指定一个维度的上限小于下限的数组时发生的情况(如果未指定,则默认下限为 1)),但什么也没有然后有趣的是分配的数组就完成了。

您可以在不使用可分配对象的情况下构建等效示例。

关于arrays - Fortran 中零大小数组究竟发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48472873/

相关文章:

c++ - 使用 std::vector 类构造函数对 C 数组进行 Constexpr 包装

javascript - 在对象上使用 jQuery grep

iphone - 哪个选项给我更好的性能 : a variable declaration or an implicit function in iOS

c++ - 为什么 realloc 会使我的自定义分配器数据无效?

arrays - 访问 Fortran 字符串中特定索引处的字符

string - 如何在 F90 中编写 to_upper() 或 to_lower() 函数?

c - 如何迭代多个数组

php - 不区分大小写的数组搜索

linux - 如何计算从同一父进程派生的进程使用的总物理内存?

c - cygwin 中混合 C/FORTRAN 程序的共享内存处理