But that prints nothing, and no error. What went wrong?
des does not point to the start of the string anymore after doing (*des++ = *src++). In fact, des is pointing to one element past the NUL character, which terminates the string, thereafter.
Thus, if you want to print the string by using printf("%s\n",des) it invokes undefined behavior.
You need to store the address value of the "start" pointer (pointing at the first char object of the allocated memory chunk) into a temporary "holder" pointer. There are various ways possible.
#include <stdio.h>
#include <stdlib.h>
int main (void) {
    char *des = malloc(sizeof(char) * 10);
    if (!des)
    {
        fputs("Error at allocation!", stderr);
        return 1;
    }
    char *tmp = des;
    for (const char *src = "abcdef"; (*des++ = *src++) ; );
    des = temp;
    printf("%s\n",des);
    free(des);
}
Alternatives:
#include <stdio.h>
#include <stdlib.h>
int main (void) {
    char *des = malloc(sizeof(char) * 10);
    if (!des)
    {
        fputs("Error at allocation!", stderr);
        return 1;
    }
    char *tmp = des;
    for (const char *src = "abcdef"; (*des++ = *src++) ; );
    printf("%s\n", tmp);
    free(tmp);
}
or
#include <stdio.h>
#include <stdlib.h>
int main (void) {
    char *des = malloc(sizeof(char) * 10);
    if (!des)
    {
        fputs("Error at allocation!", stderr);
        return 1;
    }
    char *tmp = des;
    for (const char *src = "abcdef"; (*tmp++ = *src++) ; );
    printf("%s\n", des);
    free(des);
}
Side notes:
- "abcdef\0"- The explicit- \0is not needed. It is appended automatically during translation. Use- "abcdef".
 
- Always check the return of memory-management function if the allocation succeeded by checking the returned for a null pointer. 
- Qualify pointers to string literal by - constto avoid unintentional write attempts.
 
- Use - sizeof(char) * 10instead of plain- 10in the call the malloc. This ensures the write size if the type changes.
 
- int main (void)instead of- int main (void). The first one is standard-compliant, the second not.
 
- Always - free()dynamically allocated memory, since you no longer need the allocated memory. In the example above it would be redundant, but if your program becomes larger and the example is part-focused you should- free()the unneeded memory immediately.