The method of memory management you describe predates ALLOCATE, which was introduced in Fortran 90.
There are many programs, including my FEA program which still use these methods successfully. Many public domain programs were developed in 70's and 80's using this approach and they are still in use today.
There are many tricks that can be used to overcome the problem you have found.
The easiest is to not use /check when you compile and the problem will go away.
You could try to convert the memory management to using ALLOCATE, although ALLOCATE does not easily support resizeing arrays, such as when you allocate a 'big' array then resize it after you know how big it needs to be. There are many things that ALLOCATE is good at but this in not one of them. Any change involving ALLOCATE involves significant re-programming.
Involving even more re-programming is using a MODULE of all key arrays and making these arrays ALLOCATABLE. This is the neatest approach.
If you want to keep using /CHECK and minimise your changes, you can use two arrays and equivalence them. The problem you need to check is when the program was written. If it uses INTEGER4 and REAL8 then it may have addressed the problem that real8 is 8 bytes and integer4 is 4 bytes. An example code that could be used is
integer4, parameter :: million = 1000000
integer4, parameter :: R8_size = 50million
integer4, parameter :: I4_size = R8_size2
!
COMMON /Big_Mem/ AA_mem
!
integer4 IA_mem(I4_size)
real8 AA_mem(r8_size)
equivalence (IA_mem, AA_mem)
!
! note as you allocate address pointers to AA_mem, say p_array
! the same address pointer for IA_mem is ip_array = P_array2-1
!
This code is typically in an include file.
You can not use it in a module, as EQUIVALENCE is not allowed in a module.
You can then substitute all calls referencing AA for integers as IA with an appropriate calculation of the array pointer. I've written my own 'MALLOC' routine to manage all the P_ARRAY pointer calculations.
You will find that ALLOCATE can be easier for new code, unless you need to resize a large array.
Be warned, programs that were developed in 70's for Cyber computers, had the same length INTEGER and REAL (60 bits). These do not recognise the different byte size of say IA(100) and AA(100). Converting to integer4 and real8 requires careful checking. Sometimes the same address was given as multiple arguments and the array shared both integer and real values. I still use this approach for reading nodes, which share real coordinates and integer fixity info.
You also indicate that you use real (kind=1), which is real4. There are few areas of FEA calculations where real4 is sufficiently accurate. These typically have to be converted to real*8 to obtain the necessary precision, which applied to all public domain programs developed on cyber machines. Generic intrinsics, introduced in Fortran 90 made this a lot easier.
It may not be legal Fortran, but it is widely used, especially in FEA programs.
John