C: Array of automatic storage class?












5















I'm reading C How to Program and I have a question about storage classes of arrays. In the book it says:




Array and structs are "static" entities in that they remain the same size throughout the program execution (they may, of course, be of automatic storage class and hence created and destroyed each time the blocks in which they're defined are entered and exited)




I'm not sure about what blocks mean, my current understanding is that function/for/while are blocks. I've tried the following:



...
for (size_t i=1; i<=2; i++) {
printf("round %c:", i+'0');
int a[10];
show_array(a, 10); // this is a function that prints all elements of `a`.
for (size_t j=0;j<10;j++) {
a[j]=8;
}
}


I got the output:



round 1:0,0,0,0,-1160480784,22023,-1160481168,22023,1594487680,32766,
round 2:8,8,8,8,8,8,8,8,8,8,


It seems like int a[10] is static, and not automatic storage class, am I missing something? (I understand the four storage classes)



I used ideone.com to run my test, if you need this information.










share|improve this question




















  • 1





    What do you think "automatic storage class" means?

    – Fred Larson
    Nov 19 '18 at 20:18






  • 1





    Are 32766 or -1160481168 "unitialised values"? If they are, why 8 isn't?

    – n.m.
    Nov 19 '18 at 20:30






  • 2





    We have very good evidence that the array does not have static storage duration—anything with static storage duration is initialized to 0 at the start of the program, unless you initialize it to something else. Since your array contains garbage numbers like -1160480784, it cannot have static storage duration (unless your program has memory errors somewhere else).

    – Dietrich Epp
    Nov 19 '18 at 20:30






  • 1





    Per C 2018 6.8.2 2, a compound statement is a block. A compound statement is a pair of braces, { and }, with declarations and/or statements inside it.

    – Eric Postpischil
    Nov 19 '18 at 20:30






  • 1





    @user7813604: When execution of a block ends, the lifetime of each object with automatic storage duration associated with that block ends. When another execution of the block begins, each such object created in it has a new lifetime. Every iteration is different.

    – Eric Postpischil
    Nov 19 '18 at 22:37


















5















I'm reading C How to Program and I have a question about storage classes of arrays. In the book it says:




Array and structs are "static" entities in that they remain the same size throughout the program execution (they may, of course, be of automatic storage class and hence created and destroyed each time the blocks in which they're defined are entered and exited)




I'm not sure about what blocks mean, my current understanding is that function/for/while are blocks. I've tried the following:



...
for (size_t i=1; i<=2; i++) {
printf("round %c:", i+'0');
int a[10];
show_array(a, 10); // this is a function that prints all elements of `a`.
for (size_t j=0;j<10;j++) {
a[j]=8;
}
}


I got the output:



round 1:0,0,0,0,-1160480784,22023,-1160481168,22023,1594487680,32766,
round 2:8,8,8,8,8,8,8,8,8,8,


It seems like int a[10] is static, and not automatic storage class, am I missing something? (I understand the four storage classes)



I used ideone.com to run my test, if you need this information.










share|improve this question




















  • 1





    What do you think "automatic storage class" means?

    – Fred Larson
    Nov 19 '18 at 20:18






  • 1





    Are 32766 or -1160481168 "unitialised values"? If they are, why 8 isn't?

    – n.m.
    Nov 19 '18 at 20:30






  • 2





    We have very good evidence that the array does not have static storage duration—anything with static storage duration is initialized to 0 at the start of the program, unless you initialize it to something else. Since your array contains garbage numbers like -1160480784, it cannot have static storage duration (unless your program has memory errors somewhere else).

    – Dietrich Epp
    Nov 19 '18 at 20:30






  • 1





    Per C 2018 6.8.2 2, a compound statement is a block. A compound statement is a pair of braces, { and }, with declarations and/or statements inside it.

    – Eric Postpischil
    Nov 19 '18 at 20:30






  • 1





    @user7813604: When execution of a block ends, the lifetime of each object with automatic storage duration associated with that block ends. When another execution of the block begins, each such object created in it has a new lifetime. Every iteration is different.

    – Eric Postpischil
    Nov 19 '18 at 22:37
















5












5








5








I'm reading C How to Program and I have a question about storage classes of arrays. In the book it says:




Array and structs are "static" entities in that they remain the same size throughout the program execution (they may, of course, be of automatic storage class and hence created and destroyed each time the blocks in which they're defined are entered and exited)




I'm not sure about what blocks mean, my current understanding is that function/for/while are blocks. I've tried the following:



...
for (size_t i=1; i<=2; i++) {
printf("round %c:", i+'0');
int a[10];
show_array(a, 10); // this is a function that prints all elements of `a`.
for (size_t j=0;j<10;j++) {
a[j]=8;
}
}


I got the output:



round 1:0,0,0,0,-1160480784,22023,-1160481168,22023,1594487680,32766,
round 2:8,8,8,8,8,8,8,8,8,8,


It seems like int a[10] is static, and not automatic storage class, am I missing something? (I understand the four storage classes)



I used ideone.com to run my test, if you need this information.










share|improve this question
















I'm reading C How to Program and I have a question about storage classes of arrays. In the book it says:




Array and structs are "static" entities in that they remain the same size throughout the program execution (they may, of course, be of automatic storage class and hence created and destroyed each time the blocks in which they're defined are entered and exited)




I'm not sure about what blocks mean, my current understanding is that function/for/while are blocks. I've tried the following:



...
for (size_t i=1; i<=2; i++) {
printf("round %c:", i+'0');
int a[10];
show_array(a, 10); // this is a function that prints all elements of `a`.
for (size_t j=0;j<10;j++) {
a[j]=8;
}
}


I got the output:



round 1:0,0,0,0,-1160480784,22023,-1160481168,22023,1594487680,32766,
round 2:8,8,8,8,8,8,8,8,8,8,


It seems like int a[10] is static, and not automatic storage class, am I missing something? (I understand the four storage classes)



I used ideone.com to run my test, if you need this information.







c






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 19 '18 at 21:01







ptr_NE

















asked Nov 19 '18 at 20:17









ptr_NEptr_NE

603324




603324








  • 1





    What do you think "automatic storage class" means?

    – Fred Larson
    Nov 19 '18 at 20:18






  • 1





    Are 32766 or -1160481168 "unitialised values"? If they are, why 8 isn't?

    – n.m.
    Nov 19 '18 at 20:30






  • 2





    We have very good evidence that the array does not have static storage duration—anything with static storage duration is initialized to 0 at the start of the program, unless you initialize it to something else. Since your array contains garbage numbers like -1160480784, it cannot have static storage duration (unless your program has memory errors somewhere else).

    – Dietrich Epp
    Nov 19 '18 at 20:30






  • 1





    Per C 2018 6.8.2 2, a compound statement is a block. A compound statement is a pair of braces, { and }, with declarations and/or statements inside it.

    – Eric Postpischil
    Nov 19 '18 at 20:30






  • 1





    @user7813604: When execution of a block ends, the lifetime of each object with automatic storage duration associated with that block ends. When another execution of the block begins, each such object created in it has a new lifetime. Every iteration is different.

    – Eric Postpischil
    Nov 19 '18 at 22:37
















  • 1





    What do you think "automatic storage class" means?

    – Fred Larson
    Nov 19 '18 at 20:18






  • 1





    Are 32766 or -1160481168 "unitialised values"? If they are, why 8 isn't?

    – n.m.
    Nov 19 '18 at 20:30






  • 2





    We have very good evidence that the array does not have static storage duration—anything with static storage duration is initialized to 0 at the start of the program, unless you initialize it to something else. Since your array contains garbage numbers like -1160480784, it cannot have static storage duration (unless your program has memory errors somewhere else).

    – Dietrich Epp
    Nov 19 '18 at 20:30






  • 1





    Per C 2018 6.8.2 2, a compound statement is a block. A compound statement is a pair of braces, { and }, with declarations and/or statements inside it.

    – Eric Postpischil
    Nov 19 '18 at 20:30






  • 1





    @user7813604: When execution of a block ends, the lifetime of each object with automatic storage duration associated with that block ends. When another execution of the block begins, each such object created in it has a new lifetime. Every iteration is different.

    – Eric Postpischil
    Nov 19 '18 at 22:37










1




1





What do you think "automatic storage class" means?

– Fred Larson
Nov 19 '18 at 20:18





What do you think "automatic storage class" means?

– Fred Larson
Nov 19 '18 at 20:18




1




1





Are 32766 or -1160481168 "unitialised values"? If they are, why 8 isn't?

– n.m.
Nov 19 '18 at 20:30





Are 32766 or -1160481168 "unitialised values"? If they are, why 8 isn't?

– n.m.
Nov 19 '18 at 20:30




2




2





We have very good evidence that the array does not have static storage duration—anything with static storage duration is initialized to 0 at the start of the program, unless you initialize it to something else. Since your array contains garbage numbers like -1160480784, it cannot have static storage duration (unless your program has memory errors somewhere else).

– Dietrich Epp
Nov 19 '18 at 20:30





We have very good evidence that the array does not have static storage duration—anything with static storage duration is initialized to 0 at the start of the program, unless you initialize it to something else. Since your array contains garbage numbers like -1160480784, it cannot have static storage duration (unless your program has memory errors somewhere else).

– Dietrich Epp
Nov 19 '18 at 20:30




1




1





Per C 2018 6.8.2 2, a compound statement is a block. A compound statement is a pair of braces, { and }, with declarations and/or statements inside it.

– Eric Postpischil
Nov 19 '18 at 20:30





Per C 2018 6.8.2 2, a compound statement is a block. A compound statement is a pair of braces, { and }, with declarations and/or statements inside it.

– Eric Postpischil
Nov 19 '18 at 20:30




1




1





@user7813604: When execution of a block ends, the lifetime of each object with automatic storage duration associated with that block ends. When another execution of the block begins, each such object created in it has a new lifetime. Every iteration is different.

– Eric Postpischil
Nov 19 '18 at 22:37







@user7813604: When execution of a block ends, the lifetime of each object with automatic storage duration associated with that block ends. When another execution of the block begins, each such object created in it has a new lifetime. Every iteration is different.

– Eric Postpischil
Nov 19 '18 at 22:37














5 Answers
5






active

oldest

votes


















5














You are indeed missing something. a does have automatic storage, and the values that are printed are a consequence of the memory being re-used, not of the storage being persistent. The values will be reset in debug mode (perhaps not by all development environments, but some will set the members to 0xCCCCCCCC on each iteration). Also, good compilers (most compilers, if you enable all warnings) will tell you that you're using uninitialized data here.



If you still don't believe me, try this example. It will show that the memory values in a are overwritten by the values stored in b. The array a ceases to exist at the end of the if statement's dependent block of code, and all of that memory is made available to the system. On the next iteration, it will probably be used for array b, which is why you'll see values of 8 printed in array b, even though they were assigned to a.



for (size_t i=1; i<=2; i++)
{
if( i&1 )
{
printf("round %c:", i+'0');
int a[10];
show_array(a, 10);
for (size_t j=0;j<10;j++) a[j]=8;
}
else
{
printf("round %c:", i+'0');
int b[10];
show_array(b, 10);
for (size_t j=0;j<10;j++) b[j]=888;
}
}


For a final confirmation that memory is being re-used, you could modify show_array to print the raw pointer passed in, not just the individual elements. You should see the same address each time.






share|improve this answer


























  • Is that when the array a be automatic storage, it mean the array itself is automatic or the elements in the array be automatic?

    – ptr_NE
    Nov 19 '18 at 20:27






  • 1





    An array has the same storage class as the elements inside it (how would an element inside an array outlive the array?)

    – Dietrich Epp
    Nov 19 '18 at 20:28











  • What @DietrichEpp said. I'll add anote to the answer

    – Tim Randall
    Nov 19 '18 at 20:28











  • @DietrichEpp: oh I got it!

    – ptr_NE
    Nov 19 '18 at 20:29











  • Thank you sir I do believe you but it's just my style of asking.

    – ptr_NE
    Nov 19 '18 at 20:57



















4














"Automatic storage class" refers to the scope in which the variable is defined. It means that the memory allocated to the variable will be freed upon exiting the scope in which the variable was created, not that the memory will be initialized for you. You still have to do that yourself. The reason you see the 8s in the second iteration of your loop is because the same memory that was freed in the previous iteration was reassigned to the array.






share|improve this answer































    3














    The array a is an automatic variable because it is defined in a block scope, the block in this case being the body of the for loop. The fact that you see the values you set the last time doesn't mean the variable is static.



    Automatic variables are uninitialized if not explicitly initialized. This basically means they'll contain whatever happened to be in those memory locations the last time they were used.



    On the first iteration of the loop, you see seemingly random values in the array. The variable then goes out of scope at the end of the loop, and on the next iteration a new instance is created, but in this case it happened to be created at the same memory location it was created at last time, and nothing else happened to write to that memory location, so you end up seeing the same values. There's no guarantee that you'll see the same behavior if you for example make an unrelated code change or compile with different optimization settings.






    share|improve this answer

































      2














      When the lifetime of an object with automatic storage duration ends, that just means the memory is released (so that it may be used for other purposes). It does not guarantee that the memory is erased or that it is used for other purposes.



      When the lifetime of another instance of the same object begins, memory is allocated for it again. It may happen to be the same memory that was used for it before. There is no guarantee that it was erased or used for other purposes.






      share|improve this answer































        2














        Your program has what is scientifically known as undefined behaviour. In your case it results from using (printing) a bunch of int objects before initialising them.



        Since the behaviour is undefined, program output can be anything at all, including a stream of characters that could possibly in theory lead someone into believing in an obvious nonsense (like a having static storage duration).



        In practical terms, this is what happens if you ignore the high-brow world of language standards and look at the iron:




        • At round 1 a contains garbage values, remnants of whatever has been stored at that memory location previously.

        • At round 2 a still contains garbage values, remnants of whatever has been stored at that memory location previously.


        The only difference is that the garbage looks familiar to you, because it happens to be your garbage. You can see it because the garbage people did not have a chance to collect it yet. It is still garbage however — the garbage people will remove it at some point.






        share|improve this answer

























          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53382014%2fc-array-of-automatic-storage-class%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          5 Answers
          5






          active

          oldest

          votes








          5 Answers
          5






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          5














          You are indeed missing something. a does have automatic storage, and the values that are printed are a consequence of the memory being re-used, not of the storage being persistent. The values will be reset in debug mode (perhaps not by all development environments, but some will set the members to 0xCCCCCCCC on each iteration). Also, good compilers (most compilers, if you enable all warnings) will tell you that you're using uninitialized data here.



          If you still don't believe me, try this example. It will show that the memory values in a are overwritten by the values stored in b. The array a ceases to exist at the end of the if statement's dependent block of code, and all of that memory is made available to the system. On the next iteration, it will probably be used for array b, which is why you'll see values of 8 printed in array b, even though they were assigned to a.



          for (size_t i=1; i<=2; i++)
          {
          if( i&1 )
          {
          printf("round %c:", i+'0');
          int a[10];
          show_array(a, 10);
          for (size_t j=0;j<10;j++) a[j]=8;
          }
          else
          {
          printf("round %c:", i+'0');
          int b[10];
          show_array(b, 10);
          for (size_t j=0;j<10;j++) b[j]=888;
          }
          }


          For a final confirmation that memory is being re-used, you could modify show_array to print the raw pointer passed in, not just the individual elements. You should see the same address each time.






          share|improve this answer


























          • Is that when the array a be automatic storage, it mean the array itself is automatic or the elements in the array be automatic?

            – ptr_NE
            Nov 19 '18 at 20:27






          • 1





            An array has the same storage class as the elements inside it (how would an element inside an array outlive the array?)

            – Dietrich Epp
            Nov 19 '18 at 20:28











          • What @DietrichEpp said. I'll add anote to the answer

            – Tim Randall
            Nov 19 '18 at 20:28











          • @DietrichEpp: oh I got it!

            – ptr_NE
            Nov 19 '18 at 20:29











          • Thank you sir I do believe you but it's just my style of asking.

            – ptr_NE
            Nov 19 '18 at 20:57
















          5














          You are indeed missing something. a does have automatic storage, and the values that are printed are a consequence of the memory being re-used, not of the storage being persistent. The values will be reset in debug mode (perhaps not by all development environments, but some will set the members to 0xCCCCCCCC on each iteration). Also, good compilers (most compilers, if you enable all warnings) will tell you that you're using uninitialized data here.



          If you still don't believe me, try this example. It will show that the memory values in a are overwritten by the values stored in b. The array a ceases to exist at the end of the if statement's dependent block of code, and all of that memory is made available to the system. On the next iteration, it will probably be used for array b, which is why you'll see values of 8 printed in array b, even though they were assigned to a.



          for (size_t i=1; i<=2; i++)
          {
          if( i&1 )
          {
          printf("round %c:", i+'0');
          int a[10];
          show_array(a, 10);
          for (size_t j=0;j<10;j++) a[j]=8;
          }
          else
          {
          printf("round %c:", i+'0');
          int b[10];
          show_array(b, 10);
          for (size_t j=0;j<10;j++) b[j]=888;
          }
          }


          For a final confirmation that memory is being re-used, you could modify show_array to print the raw pointer passed in, not just the individual elements. You should see the same address each time.






          share|improve this answer


























          • Is that when the array a be automatic storage, it mean the array itself is automatic or the elements in the array be automatic?

            – ptr_NE
            Nov 19 '18 at 20:27






          • 1





            An array has the same storage class as the elements inside it (how would an element inside an array outlive the array?)

            – Dietrich Epp
            Nov 19 '18 at 20:28











          • What @DietrichEpp said. I'll add anote to the answer

            – Tim Randall
            Nov 19 '18 at 20:28











          • @DietrichEpp: oh I got it!

            – ptr_NE
            Nov 19 '18 at 20:29











          • Thank you sir I do believe you but it's just my style of asking.

            – ptr_NE
            Nov 19 '18 at 20:57














          5












          5








          5







          You are indeed missing something. a does have automatic storage, and the values that are printed are a consequence of the memory being re-used, not of the storage being persistent. The values will be reset in debug mode (perhaps not by all development environments, but some will set the members to 0xCCCCCCCC on each iteration). Also, good compilers (most compilers, if you enable all warnings) will tell you that you're using uninitialized data here.



          If you still don't believe me, try this example. It will show that the memory values in a are overwritten by the values stored in b. The array a ceases to exist at the end of the if statement's dependent block of code, and all of that memory is made available to the system. On the next iteration, it will probably be used for array b, which is why you'll see values of 8 printed in array b, even though they were assigned to a.



          for (size_t i=1; i<=2; i++)
          {
          if( i&1 )
          {
          printf("round %c:", i+'0');
          int a[10];
          show_array(a, 10);
          for (size_t j=0;j<10;j++) a[j]=8;
          }
          else
          {
          printf("round %c:", i+'0');
          int b[10];
          show_array(b, 10);
          for (size_t j=0;j<10;j++) b[j]=888;
          }
          }


          For a final confirmation that memory is being re-used, you could modify show_array to print the raw pointer passed in, not just the individual elements. You should see the same address each time.






          share|improve this answer















          You are indeed missing something. a does have automatic storage, and the values that are printed are a consequence of the memory being re-used, not of the storage being persistent. The values will be reset in debug mode (perhaps not by all development environments, but some will set the members to 0xCCCCCCCC on each iteration). Also, good compilers (most compilers, if you enable all warnings) will tell you that you're using uninitialized data here.



          If you still don't believe me, try this example. It will show that the memory values in a are overwritten by the values stored in b. The array a ceases to exist at the end of the if statement's dependent block of code, and all of that memory is made available to the system. On the next iteration, it will probably be used for array b, which is why you'll see values of 8 printed in array b, even though they were assigned to a.



          for (size_t i=1; i<=2; i++)
          {
          if( i&1 )
          {
          printf("round %c:", i+'0');
          int a[10];
          show_array(a, 10);
          for (size_t j=0;j<10;j++) a[j]=8;
          }
          else
          {
          printf("round %c:", i+'0');
          int b[10];
          show_array(b, 10);
          for (size_t j=0;j<10;j++) b[j]=888;
          }
          }


          For a final confirmation that memory is being re-used, you could modify show_array to print the raw pointer passed in, not just the individual elements. You should see the same address each time.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 19 '18 at 20:32

























          answered Nov 19 '18 at 20:24









          Tim RandallTim Randall

          2,0711424




          2,0711424













          • Is that when the array a be automatic storage, it mean the array itself is automatic or the elements in the array be automatic?

            – ptr_NE
            Nov 19 '18 at 20:27






          • 1





            An array has the same storage class as the elements inside it (how would an element inside an array outlive the array?)

            – Dietrich Epp
            Nov 19 '18 at 20:28











          • What @DietrichEpp said. I'll add anote to the answer

            – Tim Randall
            Nov 19 '18 at 20:28











          • @DietrichEpp: oh I got it!

            – ptr_NE
            Nov 19 '18 at 20:29











          • Thank you sir I do believe you but it's just my style of asking.

            – ptr_NE
            Nov 19 '18 at 20:57



















          • Is that when the array a be automatic storage, it mean the array itself is automatic or the elements in the array be automatic?

            – ptr_NE
            Nov 19 '18 at 20:27






          • 1





            An array has the same storage class as the elements inside it (how would an element inside an array outlive the array?)

            – Dietrich Epp
            Nov 19 '18 at 20:28











          • What @DietrichEpp said. I'll add anote to the answer

            – Tim Randall
            Nov 19 '18 at 20:28











          • @DietrichEpp: oh I got it!

            – ptr_NE
            Nov 19 '18 at 20:29











          • Thank you sir I do believe you but it's just my style of asking.

            – ptr_NE
            Nov 19 '18 at 20:57

















          Is that when the array a be automatic storage, it mean the array itself is automatic or the elements in the array be automatic?

          – ptr_NE
          Nov 19 '18 at 20:27





          Is that when the array a be automatic storage, it mean the array itself is automatic or the elements in the array be automatic?

          – ptr_NE
          Nov 19 '18 at 20:27




          1




          1





          An array has the same storage class as the elements inside it (how would an element inside an array outlive the array?)

          – Dietrich Epp
          Nov 19 '18 at 20:28





          An array has the same storage class as the elements inside it (how would an element inside an array outlive the array?)

          – Dietrich Epp
          Nov 19 '18 at 20:28













          What @DietrichEpp said. I'll add anote to the answer

          – Tim Randall
          Nov 19 '18 at 20:28





          What @DietrichEpp said. I'll add anote to the answer

          – Tim Randall
          Nov 19 '18 at 20:28













          @DietrichEpp: oh I got it!

          – ptr_NE
          Nov 19 '18 at 20:29





          @DietrichEpp: oh I got it!

          – ptr_NE
          Nov 19 '18 at 20:29













          Thank you sir I do believe you but it's just my style of asking.

          – ptr_NE
          Nov 19 '18 at 20:57





          Thank you sir I do believe you but it's just my style of asking.

          – ptr_NE
          Nov 19 '18 at 20:57













          4














          "Automatic storage class" refers to the scope in which the variable is defined. It means that the memory allocated to the variable will be freed upon exiting the scope in which the variable was created, not that the memory will be initialized for you. You still have to do that yourself. The reason you see the 8s in the second iteration of your loop is because the same memory that was freed in the previous iteration was reassigned to the array.






          share|improve this answer




























            4














            "Automatic storage class" refers to the scope in which the variable is defined. It means that the memory allocated to the variable will be freed upon exiting the scope in which the variable was created, not that the memory will be initialized for you. You still have to do that yourself. The reason you see the 8s in the second iteration of your loop is because the same memory that was freed in the previous iteration was reassigned to the array.






            share|improve this answer


























              4












              4








              4







              "Automatic storage class" refers to the scope in which the variable is defined. It means that the memory allocated to the variable will be freed upon exiting the scope in which the variable was created, not that the memory will be initialized for you. You still have to do that yourself. The reason you see the 8s in the second iteration of your loop is because the same memory that was freed in the previous iteration was reassigned to the array.






              share|improve this answer













              "Automatic storage class" refers to the scope in which the variable is defined. It means that the memory allocated to the variable will be freed upon exiting the scope in which the variable was created, not that the memory will be initialized for you. You still have to do that yourself. The reason you see the 8s in the second iteration of your loop is because the same memory that was freed in the previous iteration was reassigned to the array.







              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered Nov 19 '18 at 20:30









              mnisticmnistic

              7,1711923




              7,1711923























                  3














                  The array a is an automatic variable because it is defined in a block scope, the block in this case being the body of the for loop. The fact that you see the values you set the last time doesn't mean the variable is static.



                  Automatic variables are uninitialized if not explicitly initialized. This basically means they'll contain whatever happened to be in those memory locations the last time they were used.



                  On the first iteration of the loop, you see seemingly random values in the array. The variable then goes out of scope at the end of the loop, and on the next iteration a new instance is created, but in this case it happened to be created at the same memory location it was created at last time, and nothing else happened to write to that memory location, so you end up seeing the same values. There's no guarantee that you'll see the same behavior if you for example make an unrelated code change or compile with different optimization settings.






                  share|improve this answer






























                    3














                    The array a is an automatic variable because it is defined in a block scope, the block in this case being the body of the for loop. The fact that you see the values you set the last time doesn't mean the variable is static.



                    Automatic variables are uninitialized if not explicitly initialized. This basically means they'll contain whatever happened to be in those memory locations the last time they were used.



                    On the first iteration of the loop, you see seemingly random values in the array. The variable then goes out of scope at the end of the loop, and on the next iteration a new instance is created, but in this case it happened to be created at the same memory location it was created at last time, and nothing else happened to write to that memory location, so you end up seeing the same values. There's no guarantee that you'll see the same behavior if you for example make an unrelated code change or compile with different optimization settings.






                    share|improve this answer




























                      3












                      3








                      3







                      The array a is an automatic variable because it is defined in a block scope, the block in this case being the body of the for loop. The fact that you see the values you set the last time doesn't mean the variable is static.



                      Automatic variables are uninitialized if not explicitly initialized. This basically means they'll contain whatever happened to be in those memory locations the last time they were used.



                      On the first iteration of the loop, you see seemingly random values in the array. The variable then goes out of scope at the end of the loop, and on the next iteration a new instance is created, but in this case it happened to be created at the same memory location it was created at last time, and nothing else happened to write to that memory location, so you end up seeing the same values. There's no guarantee that you'll see the same behavior if you for example make an unrelated code change or compile with different optimization settings.






                      share|improve this answer















                      The array a is an automatic variable because it is defined in a block scope, the block in this case being the body of the for loop. The fact that you see the values you set the last time doesn't mean the variable is static.



                      Automatic variables are uninitialized if not explicitly initialized. This basically means they'll contain whatever happened to be in those memory locations the last time they were used.



                      On the first iteration of the loop, you see seemingly random values in the array. The variable then goes out of scope at the end of the loop, and on the next iteration a new instance is created, but in this case it happened to be created at the same memory location it was created at last time, and nothing else happened to write to that memory location, so you end up seeing the same values. There's no guarantee that you'll see the same behavior if you for example make an unrelated code change or compile with different optimization settings.







                      share|improve this answer














                      share|improve this answer



                      share|improve this answer








                      edited Nov 19 '18 at 20:36

























                      answered Nov 19 '18 at 20:27









                      dbushdbush

                      97.2k13104138




                      97.2k13104138























                          2














                          When the lifetime of an object with automatic storage duration ends, that just means the memory is released (so that it may be used for other purposes). It does not guarantee that the memory is erased or that it is used for other purposes.



                          When the lifetime of another instance of the same object begins, memory is allocated for it again. It may happen to be the same memory that was used for it before. There is no guarantee that it was erased or used for other purposes.






                          share|improve this answer




























                            2














                            When the lifetime of an object with automatic storage duration ends, that just means the memory is released (so that it may be used for other purposes). It does not guarantee that the memory is erased or that it is used for other purposes.



                            When the lifetime of another instance of the same object begins, memory is allocated for it again. It may happen to be the same memory that was used for it before. There is no guarantee that it was erased or used for other purposes.






                            share|improve this answer


























                              2












                              2








                              2







                              When the lifetime of an object with automatic storage duration ends, that just means the memory is released (so that it may be used for other purposes). It does not guarantee that the memory is erased or that it is used for other purposes.



                              When the lifetime of another instance of the same object begins, memory is allocated for it again. It may happen to be the same memory that was used for it before. There is no guarantee that it was erased or used for other purposes.






                              share|improve this answer













                              When the lifetime of an object with automatic storage duration ends, that just means the memory is released (so that it may be used for other purposes). It does not guarantee that the memory is erased or that it is used for other purposes.



                              When the lifetime of another instance of the same object begins, memory is allocated for it again. It may happen to be the same memory that was used for it before. There is no guarantee that it was erased or used for other purposes.







                              share|improve this answer












                              share|improve this answer



                              share|improve this answer










                              answered Nov 19 '18 at 20:27









                              Eric PostpischilEric Postpischil

                              75.3k880162




                              75.3k880162























                                  2














                                  Your program has what is scientifically known as undefined behaviour. In your case it results from using (printing) a bunch of int objects before initialising them.



                                  Since the behaviour is undefined, program output can be anything at all, including a stream of characters that could possibly in theory lead someone into believing in an obvious nonsense (like a having static storage duration).



                                  In practical terms, this is what happens if you ignore the high-brow world of language standards and look at the iron:




                                  • At round 1 a contains garbage values, remnants of whatever has been stored at that memory location previously.

                                  • At round 2 a still contains garbage values, remnants of whatever has been stored at that memory location previously.


                                  The only difference is that the garbage looks familiar to you, because it happens to be your garbage. You can see it because the garbage people did not have a chance to collect it yet. It is still garbage however — the garbage people will remove it at some point.






                                  share|improve this answer






























                                    2














                                    Your program has what is scientifically known as undefined behaviour. In your case it results from using (printing) a bunch of int objects before initialising them.



                                    Since the behaviour is undefined, program output can be anything at all, including a stream of characters that could possibly in theory lead someone into believing in an obvious nonsense (like a having static storage duration).



                                    In practical terms, this is what happens if you ignore the high-brow world of language standards and look at the iron:




                                    • At round 1 a contains garbage values, remnants of whatever has been stored at that memory location previously.

                                    • At round 2 a still contains garbage values, remnants of whatever has been stored at that memory location previously.


                                    The only difference is that the garbage looks familiar to you, because it happens to be your garbage. You can see it because the garbage people did not have a chance to collect it yet. It is still garbage however — the garbage people will remove it at some point.






                                    share|improve this answer




























                                      2












                                      2








                                      2







                                      Your program has what is scientifically known as undefined behaviour. In your case it results from using (printing) a bunch of int objects before initialising them.



                                      Since the behaviour is undefined, program output can be anything at all, including a stream of characters that could possibly in theory lead someone into believing in an obvious nonsense (like a having static storage duration).



                                      In practical terms, this is what happens if you ignore the high-brow world of language standards and look at the iron:




                                      • At round 1 a contains garbage values, remnants of whatever has been stored at that memory location previously.

                                      • At round 2 a still contains garbage values, remnants of whatever has been stored at that memory location previously.


                                      The only difference is that the garbage looks familiar to you, because it happens to be your garbage. You can see it because the garbage people did not have a chance to collect it yet. It is still garbage however — the garbage people will remove it at some point.






                                      share|improve this answer















                                      Your program has what is scientifically known as undefined behaviour. In your case it results from using (printing) a bunch of int objects before initialising them.



                                      Since the behaviour is undefined, program output can be anything at all, including a stream of characters that could possibly in theory lead someone into believing in an obvious nonsense (like a having static storage duration).



                                      In practical terms, this is what happens if you ignore the high-brow world of language standards and look at the iron:




                                      • At round 1 a contains garbage values, remnants of whatever has been stored at that memory location previously.

                                      • At round 2 a still contains garbage values, remnants of whatever has been stored at that memory location previously.


                                      The only difference is that the garbage looks familiar to you, because it happens to be your garbage. You can see it because the garbage people did not have a chance to collect it yet. It is still garbage however — the garbage people will remove it at some point.







                                      share|improve this answer














                                      share|improve this answer



                                      share|improve this answer








                                      edited Nov 19 '18 at 21:06

























                                      answered Nov 19 '18 at 20:48









                                      n.m.n.m.

                                      72.1k882168




                                      72.1k882168






























                                          draft saved

                                          draft discarded




















































                                          Thanks for contributing an answer to Stack Overflow!


                                          • Please be sure to answer the question. Provide details and share your research!

                                          But avoid



                                          • Asking for help, clarification, or responding to other answers.

                                          • Making statements based on opinion; back them up with references or personal experience.


                                          To learn more, see our tips on writing great answers.




                                          draft saved


                                          draft discarded














                                          StackExchange.ready(
                                          function () {
                                          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53382014%2fc-array-of-automatic-storage-class%23new-answer', 'question_page');
                                          }
                                          );

                                          Post as a guest















                                          Required, but never shown





















































                                          Required, but never shown














                                          Required, but never shown












                                          Required, but never shown







                                          Required, but never shown

































                                          Required, but never shown














                                          Required, but never shown












                                          Required, but never shown







                                          Required, but never shown







                                          Popular posts from this blog

                                          Guess what letter conforming each word

                                          Port of Spain

                                          Run scheduled task as local user group (not BUILTIN)