All'inizio del programma, che allocare memoria per un array di char-puntatori:Marchio C: scambio puntatori porta a risultati inattesi
char **buffer = calloc(20, sizeof(char *));
Poi l'utente può inserire fino a 20 parole:
buffer[i] = calloc(40, sizeof(char));
fgets(buffer[i], 40, stdin)`
Successivamente, desidero ordinare questo array. Esso funziona come previsto se uso la mia funzione di swap come segue:
void swap(char *args1, char *args2) {
char tmp[40];
strcpy(tmp, args1);
strcpy(args1, args2);
strcpy(args2, tmp);
}
void sort(char **args, int count) {
...
swap(args[i], args[j]);
...
}
Dopo averci pensato attraverso questo, ho notato che si trattava di uno spreco di CPU dato che tutto quello che dovevo fare era in realtà reindirizzando i puntatori ai corrispondenti stringhe. Così ho riscritto la mia funzione di swap:
void swap(char **args1, char **args2) {
char *tmp = *args1;
*args1 = *args2;
*args2 = tmp;
}
void sort(char **args, int count) {
...
swap(&args[i], &args[j]);
...
}
Tuttavia, questo non funziona affatto, i risultati sono estremamente inaspettato, non riesco a capire perché (ho provato diverse chiamate printf e quant'altro) ... La mia comprensione era che i puntatori sono solo reindirizzati e quindi scambiati, diciamo la memoria è simile al seguente:
(begin of char**):
100: *160
108: *200
116: *240
124: *280
...
(begin of char*):
160: Hello!\0
200: World!\0
...
la mia idea era quella di modificare i puntatori al posto degli array per il minimo sforzo CPU (qui: puntatore di swap in 100 con puntatore in 108):
(begin of char**):
100: *200
108: *160
116: *240
124: *280
...
(begin of char*):
160: Hello!\0
200: World!\0
...
Ho cercato di spiegarlo nel modo più approfondito possibile e mi dispiace se è una spiegazione eccessiva. Sarei molto contento se qualcuno potesse darmi un'idea di questo e aiutare!
Il codice completo (con la strcpy di lavoro) può essere trovato qui: http://pastie.org/5361481
E il codice completo per quello non funzionante? –
Il codice non funzionante è solo con il metodo di sostituzione sostituito e chiama: http://pastie.org/5361515 – Danyel
Prova a passare attraverso il codice, riga per riga, con un debugger (per un piccolo insieme di input, ovviamente). –