Re: Why doesn't this code generate an inaccessible memory-error?
On Fri, 5 Feb 2010 19:21:22 CST, "iminsik@gmail.com"
<iminsik@gmail.com> wrote:
It was supposed that this code would generate an inaccessible memory-
error. I compiled this code and ran the compiled executable by g++ in
Ubuntu 9.10; it didn't generate any error. However, when it was
compiled by gcc in Windows, it generated an error expected. Can you
explain the difference between the two?
Joe.
# include <stdio.h>
# include <stdlib.h>
# define LIMIT 10000
int main(void)
{
int i=0, j=0;
int * arri = (int *) malloc(sizeof(int)*(LIMIT-LIMIT/2));
for (i=0, j=LIMIT;i<LIMIT;++i,--j)
{
*(arri+i)=j;
}
free(arri);
return 0;
}
No facts, but it's easy to guess.
The allocator (malloc) requests memory from the OS in large blocks
(multiples of megabytes) and subdivides them for smaller requests.
Your array is ~40K (32-bit) or ~80K (64-bit) and doesn't even begin to
fill the program's initial heap block.
I'm guessing that on Ubuntu the array was allocated from the beginning
of the heap while on Window it was allocated from the end. When the
loop walked off the end of the array, on Ubuntu the accesses were
still within the heap but on Windows the loop wandered into memory the
program didn't own.
In either case, the loop invokes undefined behavior. Even when you
don't get an access error, the heap has been corrupted.
George
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]