I study and test memory allocation in C, and I want to check what happens if free() called.
I was expecting a segmentation error or a NULL pointer to occur after running the program below. However, I can still successfully print the line as in Output. I also tried to free str twice, then an error occurred with exit 2.
It seems that the previously allocated memory was successfully freed, but the data in the memory is not cleared. It's right? If so, when will the program clear the freed memory space? Is it safe if the data is freed but not cleared?
Answers to any question above will be helpful! Thanks!
Code
#include <stdio.h> #include <stdlib.h> int main() { printf("Hello, World!\n"); char *str = (char *)malloc(24); char *str2 = "tutorialspoint"; strcpy(str, str2); free(str); printf("[str] %s\n", str); return 0; }
Output
Hello, World! [str] tutorialspoint
Output 2
main(83218,0x7fff9d2aa3c0) malloc: *** error for object 0x7fb0b2d00000: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug Abort trap: 6
Edit
Thanks to everyone for the helpful answers. Now I understand that in C there are some undefined behaviors (UB), and this helped me to understand, something else confused me, for example, writing a line outside the selected area (for example, in the code snippet below). This caused UB according to the wiki , but the program will not work.
Feel free to correct me if I am wrong!
char *str = (char *)malloc(0); char *str2 = "tutorialspoint"; strcat(str, str2); printf("[str] %s, [addr] %p\n", str, str);