#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {

  char mutable[20] = "I can change!";
  char * immutable = "I cannot change!";
  char * m_string;
  char * string_ptr;  

  m_string = malloc(sizeof(char) * 25);
  strcpy(m_string, "I am created on the fly!");
  string_ptr = mutable;
  
  printf("\n");
  printf("Mutable: %s\n", mutable);
  printf("Dynamic allocation: %s\n", m_string);
  printf("String ptr: %s\n", string_ptr);
  string_ptr = m_string;
  printf("String ptr reassigned: %s\n", string_ptr);
  printf("Immutable: %s\n\n", immutable);

  // setting up a mistake
  string_ptr = immutable;
  printf("String ptr reassigned again: %s\n", string_ptr);
  
  mutable[0] = 'U';
  printf("New mutable: %s\n", mutable);
  
  m_string[0] = 'U';
  printf("New dynamic allocation: %s\n", m_string);

  printf("\nThis should crash ....\n");
  string_ptr[0] = 'U';
  printf("New immutable: %s\n", string_ptr);

  printf("\nThis will crash ....\n");
  immutable[0] = 'U';
  printf("New immutable: %s\n", immutable);

  
  return 0;
}
