I cannot see anything wrong with this.
#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> /* Reference: (0 offset) uint32_t size; (+4 offset) uint32_t elementSize; (+8 offset) uint32_t lastIndex; (+12 offset) void* data */ void* create_pinned_array(uint32_t elementSize, uint32_t numberOfElements, size_t sizeOfData, void* data) { uint32_t size = sizeOfData + 12; void* memory = malloc(size); memset(memory, size, 4); // size memset(memory + 4, elementSize, 4); // elementSize memset(memory + 8, numberOfElements-1, 4); // lastIndex memcpy(memory + 12, data, sizeOfData); // actual data return memory; } int main(void) { int randomList[5] = { 1, 6, 2, 9, 8 }; void* myIntegers = create_pinned_array(sizeof(int), 5, sizeof(randomList), randomList); FILE* testfp = fopen("testfile.bin", "wb"); fwrite(myIntegers, sizeof(myIntegers), 1, testfp); fclose(testfp); free(myIntegers); return 0; } Each time I check with xxd, instead of an ordered binary file I am getting junk data which varies every time I execute the program.
sizeof(myIntegers)is the size of the pointer, not the mem block.memset(memory, size, 4);?!?!?! Do you understand thatmemset()sets every byte of what is being set to the same byte value?