On Sunday, 4 December 2022 at 16:33:35 UTC, rempas wrote:
struct MemoryBlock {
  char* ptr;
  ulong length;
}

(MemoryBlock.sizeof is 16 on my 64-bit system).

void* ptr = cast(void*)0x7a7;

void* right() {
return cast(MemoryBlock*)(ptr + MemoryBlock.sizeof); // Cast the whole expression between paranthesis. Got the right value!
}

The above adds 16 bytes to ptr.

void* wrong() {
return cast(MemoryBlock*)ptr + MemoryBlock.sizeof; // First cast the `ptr` variable and then add the number. Got a wronge value...
}

The above adds 16 * MemoryBlock.sizeof bytes (16 * 16) to ptr, because ptr is cast first. Should be `+ 1` to be equivalent.

https://dlang.org/spec/expression.html#pointer_arithmetic

"the resulting value is the pointer plus (or minus) the second operand **multiplied by the size of the type pointed to by the first operand**."

char* return_address_wrong() {
  MemoryBlock* local_ptr = cast(MemoryBlock*)ptr;
return cast(char*)(local_ptr + MemoryBlock.sizeof); // Casted the whole expression. BUT GOT THE WRONG VALUE!!!! Why???
}

Because you are adding to a pointer that points to a 16-byte block, rather than a void* which points to a single byte.

char* return_address_right() {
  MemoryBlock* local_ptr = cast(MemoryBlock*)ptr;
return cast(char*)local_ptr + MemoryBlock.sizeof; // Now I first casted the `local_ptr` variable and then added the number but this time this gave me the right value....
}

The casted pointer points to a single byte.

Reply via email to