Skip to content
Snippets Groups Projects
Select Git revision
  • b0a519004be5aaa761ef38bbcc0950b9e547512f
  • master default protected
  • radhwan.hassine-master-patch-03421
  • radhwan.hassine-master-patch-79254
4 results

string_deep_shallow_copy.c

Blame
  • Forked from algorithmique / cours
    Source project has a limited visibility.
    string_deep_shallow_copy.c 1.33 KiB
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct _chaine {
        char *str;
        int len;
    } chaine;
    
    int length(char *phrase) {
        if (NULL == phrase) {
            return -1;
        }
        int len = 0;
        while (0 != phrase[len]) {
            len++;
        }
        return len;
    }
    
    chaine chaine_build(char *phrase) {
        chaine ch;
        ch.len = length(phrase);
        ch.str = malloc((ch.len + 1) * sizeof(char));
        for (int i = 0; i < ch.len; i++) {
            ch.str[i] = phrase[i];
        }
        return ch;
    }
    
    chaine deep_copy(chaine ch) {
        return chaine_build(ch.str);
    }
    
    // Dangereux, car plusieurs pointeurs sur le même tableau de caractères !!!
    // A éviter !!!
    chaine shallow_copy(chaine ch) {
        chaine cpy;
        cpy.len = ch.len;
        cpy.str = ch.str;
        return cpy;
    }
    
    // S'il y a plusieurs pointeurs sur le même tableau de caractères,
    // les autres pointeurs ne seront pas mis à NULL
    void chaine_free(chaine *ch) {
        if (NULL != ch->str) {
            free(ch->str);
            ch->str = NULL;
        }
        ch->len = -1;
    }
    
    void main() {
        char *tutu = malloc(10 * sizeof(char));
        for (int i = 0; i < 6; i++)
            tutu[i] = 'b';
        tutu[6]    = 0;
        chaine ch  = chaine_build(tutu);
        chaine tmp = deep_copy(ch);
        ch.str[0]  = 'a';
        printf("%d\n", ch.len);
        printf("%s\n", ch.str);
        printf("%d\n", tmp.len);
        printf("%s\n", tmp.str);
    }