愤怒的三炮 发表于 2020-4-27 12:51:20

指向派生类型的指针大小问题

本帖最后由 愤怒的三炮 于 2020-4-27 17:21 编辑

【编译器 gfortran】
【版本 gcc version 8.1.0】
刚学Fortran的指针,想看看声明出来的指针大小:
program test_pointer_size
    implicit none
    integer,dimension(:,:),pointer::p=>null()
    integer,dimension(100,100),target::var
   
    print*,'the size of disassociated pointer is:'
    print*,sizeof(p)
    var(:,:) = 0
   
end
此时指针所占大小为4字节;

但是当我准备将它指向type类型时:
program test_pointer_size
    implicit none
    type bigdata
      integer,dimension(100,100)::A
    end type

    type(bigdata),pointer:: p => null()
    type(bigdata),target:: var
   
    print*,'the size of pointer without association is:'
    print*,sizeof(p)
   
    var%A(:,:) = 0
   
end
显示指针所占大小为40000字节,也就是type所占的大小。
为什么会不同呢?
请清楚的朋友指点一下,刚看Fortran的指针,不太会,先谢谢了!

li913 发表于 2020-4-27 16:03:21

本帖最后由 li913 于 2020-4-27 16:06 编辑

第一个,integer类型的指针,该类型4字节; 第二个,bigdata类型的指针,该类型40000字节。另外,第一个代码,指针未明确指向的数组是多大,ivf输出为0, gfortran为4.

愤怒的三炮 发表于 2020-4-27 17:00:48

li913 发表于 2020-4-27 16:03
第一个,integer类型的指针,该类型4字节; 第二个,bigdata类型的指针,该类型40000字节。另外,第一个代 ...

感谢您的回复!
指针不是只有几个字节大小么?请看下面的C代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
       
        int* p = NULL;

        p = (int*)malloc(10*sizeof(int));
       
        printf("%d\n", sizeof(p));

        free(p);
        return 0;
}
是因为Fortran里面的指针有什么特别的地方么?

kyra 发表于 2020-4-27 17:01:01

Fortran的指针不能用 sizeof() 函数查看其本身的大小。

注意:fortran中,指针 a,只能访问它指向的内容,而不能访问指针本身。
也就是说,a 就是 C语言中的 *a。

如果你真的要知道指针的大小,可以这样做:
type ss
type(bigdata),pointer:: p
end type ss
type(ss) :: pss
print*,sizeof(pss)

你会发现,指向任何数据类型的指针,本身都是4字节(或64位系统的8字节)
而指向数组的指针,就比较大,通常一维数组会在30字节,二维数组更大一些(不同编译器结果不同)

这是因为,Fortran的指向数组的指针,除了C指针拥有的数组内容的首地址之外,还拥有这个数组的维度,大小,上下限等信息。

愤怒的三炮 发表于 2020-4-27 17:04:31

kyra 发表于 2020-4-27 17:01
Fortran的指针不能用 sizeof() 函数查看其本身的大小。

注意:fortran中,指针 a,只能访问它指向的内容, ...

谢谢您,豁然开朗,学习了学习了!
页: [1]
查看完整版本: 指向派生类型的指针大小问题