I have below code where I have commented when I get segmentation fault and when not.
Originally I got segmentation fault and then I could figure out that probably I cannot initialize my char pointer locations like "abcd". But I am not able to understand - WHY?
I thought testString = "abcd"; will put a at first memory address, b at second and so on ...
Segmentation fault occurs when trying to free memory, based on how I initialize memory location.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    char* testString = malloc(sizeof(char) * 5);
    printf("Size of char is: %d\n", sizeof(char));
    printf("Size of int is: %d\n", sizeof(int));
    for(int i = 0; i < 5; i++)
    {
        printf("Pointer addresses are: %p\n", testString + i);
    }
    char* tempPtr = testString + 2;
    printf("My temp pointer address = %p\n", tempPtr);
    // This gives me segmentation fault ....
    testString = "abcd";
    // This will not give me segmentation fault ....    
    //int count = 65;
    //for(int i = 0; i < 5; i++)
    //{
    //    testString[i] = count + i;
    //}
    printf("Printing character...\n");
    for(int i = 0; i < 5; i++)
    {
        printf("Characters are: %c\n", testString[i]);
    }
    printf("Freeing memory...\n");
    free(testString);
    //printf("Access after freeing >>%c<<\n", tempPtr[0]);
    //free(testString);
}
Based on @M.M. and @Jonathan's comment I understood that with testString = "abcd"; my testString will point to a memory location where string "abcd" was created and since I didn't malloc'ed it I cannot free it. Also, since my original pointer to heap memory (which I got using malloc) is gone, so it is waste of memory or memory lead. 
So, does it means that when I use printf statement like printf("Printing character...\n");, this is also a memory leak? Then how do I avoid it? Looping and inserting into char* is certainly a bad idea.
 
     
     
    