[SOLVED Strange addition in C++/GCC

Programming, for all ages and all languages.
Post Reply
Tutul
Posts: 19
Joined: Fri Oct 13, 2017 6:59 pm
Libera.chat IRC: tutul_

[SOLVED Strange addition in C++/GCC

Post by Tutul »

Hi there,

I'm using a struct to define a memory area like so:

Code: Select all

typedef struct {
    size_t size; // The size of the memory area
    int magic; // Used to detect block header corruption
    bool free; // The area is free ?
} block;
Each block is directly followed by the area of size block->size, and after it, we've got the next block.

To find the next block I just need to do p + p->size + sizeof(block) (p is a pointer to a block) yea ?
But I've got strange result :/
With p=0x106c74, p->size=0xff4 and sizeof(block)=0xc I should got 0x107c74 (as 0x106c74 + 0xff4 + 0xc = 0x106c74 + 0x1000). But when testing with GDB I've got 0x112c74 :/

Any idea ? GCC optimization are disabled. Did I miss something with c++ math ?
Last edited by Tutul on Sun Jan 21, 2018 1:10 am, edited 1 time in total.
User avatar
bluemoon
Member
Member
Posts: 1761
Joined: Wed Dec 01, 2010 3:41 am
Location: Hong Kong

Re: Strange addition in C++/GCC

Post by bluemoon »

c++ pointer arithmetic acknowledge the pointer type, if p is pointer to a block type, p + p->size means &p[p->size].

so, with sizeof(block) = 12 (32-bits, with padding)

Code: Select all

p + p->size + sizeof(block)
= &p[p->size + sizeof(block)] 
= 0x106c74 + (0xff4 + 0xc) * 12
= 0x106c74 + 0xc000
= 0x112c74
Tutul
Posts: 19
Joined: Fri Oct 13, 2017 6:59 pm
Libera.chat IRC: tutul_

Re: Strange addition in C++/GCC

Post by Tutul »

Oh I feel so stupid right now, didn't think about that. Thanks
Post Reply