Your problem is that char **destination is an empty pointer to a pointer.
destination[0] points to absolutely nothing.
Here is how you would actually do it:
#include <stdio.h>
#include <string.h>
int main()
{
  char source[] = "hello world!";
  char destination[100];
  strcpy(destination, source);
  puts(destination);
  puts("string copied!");
  return 0;
}
Or if you want to determine the size of destination dynamically:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
  char source[] = "hello world!";
  char *destination = malloc(strlen(source) * sizeof(char)+1); // +1 because of null character
  strcpy(destination, source);
  puts(destination);
  puts("string copied!");
  free(destination); // IMPORTANT!!!!
  return 0;
}
Make sure you free(destination) because it is allocated on the heap and thus must be freed manually.