Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Printing a malloc'd pointer always gives the same address

Am I printing it wrong?

#include <stdio.h>
#include <stdlib.h>

int
main( void )
{
    int *       p = malloc(100000);
    int *       q;

    printf("%p\n%p\n", (void *)p, (void *)q);

    (void)getchar();            /* to run several instances at same time */

    free(p);
    return 0;
}

Whether I run it sequentially or in multiple terminals simultaneously, it always prints "0x60aa00000800" for p (q is different, though).

EDIT: Thanks for the answers, one of the reasons I was confused was because it used to print a different address each time. It turns out that a new compiler option I started using, -fsanitize=address, caused this change. Whoops.

like image 857
jpt Avatar asked Dec 16 '22 01:12

jpt


1 Answers

The value of q is uninitialized garbage, since you never assign a value to it.

It's not surprising that you get the same address for p each time you run the program. That address is almost certainly a virtual address, so it applies only to the memory space of the currently running program (process).

Virtual address 0x60aa00000800 as seen from one program and virtual address 0x60aa00000800 as seen from another program are distinct physical addresses. The operating system maps virtual addresses to physical addresses, and vice versa, so there's no conflict. (If different programs could read and write the same physical memory, it would be a security nightmare.)

It also wouldn't be surprising if they were different each time. For example, some operating systems randomize stack addresses to prevent some code exploits. I'm not sure whether heap addresses are also randomized, but they certainly could be.

https://en.wikipedia.org/wiki/Virtual_memory

like image 70
Keith Thompson Avatar answered Jan 10 '23 01:01

Keith Thompson