Questa versione funziona. Controlla le differenze...

codice:
#include <stdio.h>
#include <stdlib.h>




void strcpy2(char *dst, char *src);


int main()
{
    //char *s1 = "Salve, mondo!";
    char *s2 = "Hello, world!";
    char *s3 = malloc(sizeof(s2) + 1);


    strcpy2(s3, s2);


    printf("Stringa copiata: %s\n", s3);


    return 0;
}




void strcpy2(char *dst, char *src)
{
    while(*src != '\0')
    {
        *dst++ = *src++;
    }
    /* aggiungo il terminatore */
    *dst = '\0';
}