Friday 5 February 2016

c - If free() knows the length of my array, why can't I ask for it in my own code?



I know that it's a common convention to pass the length of dynamically allocated arrays to functions that manipulate them:



void initializeAndFree(int* anArray, size_t length);

int main(){

size_t arrayLength = 0;
scanf("%d", &arrayLength);
int* myArray = (int*)malloc(sizeof(int)*arrayLength);

initializeAndFree(myArray, arrayLength);
}

void initializeAndFree(int* anArray, size_t length){
int i = 0;
for (i = 0; i < length; i++) {

anArray[i] = 0;
}
free(anArray);
}


but if there's no way for me to get the length of the allocated memory from a pointer, how does free() "automagically" know what to deallocate when all I'm giving it is the very same pointer? Why can't I get in on the magic, as a C programmer?



Where does free() get its free (har-har) knowledge from?


Answer




Besides Klatchko's correct point that the standard does not provide for it, real malloc/free implementations often allocate more space then you ask for. E.g. if you ask for 12 bytes it may provide 16 (see A Memory Allocator, which notes that 16 is a common size). So it doesn't need to know you asked for 12 bytes, just that it gave you a 16-byte chunk.


No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...