<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Expandable array, pointers and stack overflow in Software Archive</title>
    <link>https://community.intel.com/t5/Software-Archive/Expandable-array-pointers-and-stack-overflow/m-p/953982#M20301</link>
    <description>In the following programme i try to make an "expandable array". When MXOSIZ=12 the line CXDATA(1:MXOSIZ)=CXTEMP causes a stack overflow. Why do I get a stack overflow? Can I structure my programme differently in order not to get a stack overflow? And is there a better way to make an "expandable" array.        &lt;BR /&gt;     &lt;BR /&gt;&lt;FONT size="+1"&gt;&lt;PRE&gt;
PROGRAM GROW     
     
IMPLICIT NONE      
     
!--------------------------------------------------------------   
!  **** PARAMETERS ****     
!--------------------------------------------------------------      
INTEGER(4),      PARAMETER :: MXDATL=100000      
INTEGER(4),      PARAMETER :: MXGROW=2     
     
!--------------------------------------------------------------  
!  **** VARIABLES ****     
!--------------------------------------------------------------      
INTEGER(4)                 :: MXALLO     
INTEGER(4)                 :: MXOSIZ     
INTEGER(4)                 :: MXSTAT     
INTEGER(4)                 :: MXLOOP     
INTEGER(4)                 :: MXNREC     
INTEGER(4)                 :: MXSIZE     
INTEGER(4)                 :: MXINDX     
     
CHARACTER(MXDATL), POINTER :: CXTEMP(:)     
CHARACTER(MXDATL), POINTER :: CXDATA(:)     
     
!--------------------------------------------------------------   
!  INITIALIZE.       
!--------------------------------------------------------------   
     
MXNREC=0     
MXSIZE=0     
     
!--------------------------------------------------------------   
!  FILL DATA IN ARRAY.     
!--------------------------------------------------------------   
     
DO MXLOOP=1,100     
     
!--------------------------------------------------------------   
!  INCREASE THE NUMBER OF RECORDS BY ONE.     
!--------------------------------------------------------------   
    
MXNREC=MXNREC+1     
     
!--------------------------------------------------------------   
!  ALLOCATE MORE SPACE IF OUT OF SPACE.     
!--------------------------------------------------------------     
IF (MXNREC.GT.MXSIZE) THEN     
     
IF (MXSIZE.GT.0) THEN     
CXTEMP=&amp;gt;CXDATA     
PRINT*,SIZEOF(CXTEMP)      
ENDIF     
     
MXOSIZ=MXSIZE     
MXSIZE=MXSIZE+MXGROW     
     
ALLOCATE(CXDATA(MXSIZE),STAT=MXALLO)     
     
IF (MXOSIZ.GT.0) THEN     
CXDATA(1:MXOSIZ)=CXTEMP   !STACK OVERFLOW WHEN MXOSIZ=12      
DEALLOCATE(CXTEMP,STAT=MXALLO)     
ENDIF     
     
ENDIF     
     
!--------------------------------------------------------------    
!  SAVE THE RECORD.     
!--------------------------------------------------------------    
     
CXDATA(MXNREC)='12345'     
     
ENDDO      
     
END
&lt;/PRE&gt;&lt;/FONT&gt;</description>
    <pubDate>Tue, 12 Jun 2001 20:44:26 GMT</pubDate>
    <dc:creator>fela</dc:creator>
    <dc:date>2001-06-12T20:44:26Z</dc:date>
    <item>
      <title>Expandable array, pointers and stack overflow</title>
      <link>https://community.intel.com/t5/Software-Archive/Expandable-array-pointers-and-stack-overflow/m-p/953982#M20301</link>
      <description>In the following programme i try to make an "expandable array". When MXOSIZ=12 the line CXDATA(1:MXOSIZ)=CXTEMP causes a stack overflow. Why do I get a stack overflow? Can I structure my programme differently in order not to get a stack overflow? And is there a better way to make an "expandable" array.        &lt;BR /&gt;     &lt;BR /&gt;&lt;FONT size="+1"&gt;&lt;PRE&gt;
PROGRAM GROW     
     
IMPLICIT NONE      
     
!--------------------------------------------------------------   
!  **** PARAMETERS ****     
!--------------------------------------------------------------      
INTEGER(4),      PARAMETER :: MXDATL=100000      
INTEGER(4),      PARAMETER :: MXGROW=2     
     
!--------------------------------------------------------------  
!  **** VARIABLES ****     
!--------------------------------------------------------------      
INTEGER(4)                 :: MXALLO     
INTEGER(4)                 :: MXOSIZ     
INTEGER(4)                 :: MXSTAT     
INTEGER(4)                 :: MXLOOP     
INTEGER(4)                 :: MXNREC     
INTEGER(4)                 :: MXSIZE     
INTEGER(4)                 :: MXINDX     
     
CHARACTER(MXDATL), POINTER :: CXTEMP(:)     
CHARACTER(MXDATL), POINTER :: CXDATA(:)     
     
!--------------------------------------------------------------   
!  INITIALIZE.       
!--------------------------------------------------------------   
     
MXNREC=0     
MXSIZE=0     
     
!--------------------------------------------------------------   
!  FILL DATA IN ARRAY.     
!--------------------------------------------------------------   
     
DO MXLOOP=1,100     
     
!--------------------------------------------------------------   
!  INCREASE THE NUMBER OF RECORDS BY ONE.     
!--------------------------------------------------------------   
    
MXNREC=MXNREC+1     
     
!--------------------------------------------------------------   
!  ALLOCATE MORE SPACE IF OUT OF SPACE.     
!--------------------------------------------------------------     
IF (MXNREC.GT.MXSIZE) THEN     
     
IF (MXSIZE.GT.0) THEN     
CXTEMP=&amp;gt;CXDATA     
PRINT*,SIZEOF(CXTEMP)      
ENDIF     
     
MXOSIZ=MXSIZE     
MXSIZE=MXSIZE+MXGROW     
     
ALLOCATE(CXDATA(MXSIZE),STAT=MXALLO)     
     
IF (MXOSIZ.GT.0) THEN     
CXDATA(1:MXOSIZ)=CXTEMP   !STACK OVERFLOW WHEN MXOSIZ=12      
DEALLOCATE(CXTEMP,STAT=MXALLO)     
ENDIF     
     
ENDIF     
     
!--------------------------------------------------------------    
!  SAVE THE RECORD.     
!--------------------------------------------------------------    
     
CXDATA(MXNREC)='12345'     
     
ENDDO      
     
END
&lt;/PRE&gt;&lt;/FONT&gt;</description>
      <pubDate>Tue, 12 Jun 2001 20:44:26 GMT</pubDate>
      <guid>https://community.intel.com/t5/Software-Archive/Expandable-array-pointers-and-stack-overflow/m-p/953982#M20301</guid>
      <dc:creator>fela</dc:creator>
      <dc:date>2001-06-12T20:44:26Z</dc:date>
    </item>
    <item>
      <title>Re: Expandable array, pointers and stack overflow</title>
      <link>https://community.intel.com/t5/Software-Archive/Expandable-array-pointers-and-stack-overflow/m-p/953983#M20302</link>
      <description>It would appear that the compiler is creating a stack temporary as part of the assignment, and it is exceeding the default 1MB stack allocation.  I'm not sure why a temporary is used here - I do know that our removal of unnecessary temps isn't done as much for CHARACTER types as it is for numerics.  &lt;BR /&gt;&lt;BR /&gt;I'll pass this on to our experts in this area for their consideration.&lt;BR /&gt;&lt;BR /&gt;Steve</description>
      <pubDate>Tue, 12 Jun 2001 22:36:51 GMT</pubDate>
      <guid>https://community.intel.com/t5/Software-Archive/Expandable-array-pointers-and-stack-overflow/m-p/953983#M20302</guid>
      <dc:creator>Steven_L_Intel1</dc:creator>
      <dc:date>2001-06-12T22:36:51Z</dc:date>
    </item>
  </channel>
</rss>

