Entra

View Full Version : [C] Comportamento strano con allocazione dinamica stringhe!HELP!!!


Piojolopez2406
10-05-2007, 13:46
Salve ragazzi sto incontrando nell stasera di un programmino che riceve in input una stringa e la memorizza dinamicamente, poi la copia con una memcpy in un altra stringa.

#include <stdio.h>
#include<string.h>
#include <stdlib.h>


void main ()
{
char *Pstringa;
char *STRINGA;
int a;


Pstringa = malloc( _MAX_PATH );

puts("scrivi caratteri: ");
gets(Pstringa);
puts("la stringa e': ");
printf("%s\n",Pstringa);
puts("la stringa memorizzata con 'memcpy' e': ");
a=strlen(Pstringa);
STRINGA=malloc(a);
memcpy(STRINGA,Pstringa,a);
printf("%s\n",STRINGA);
puts("la stringa memorizzata con 'memmove' e': ");
memmove(STRINGA,Pstringa,a);
printf("%s\n",STRINGA);

system("pause");
}


L'output del programma è il seguente:

scrivi caratteri:
valerio
la stringa e':
valerio
la stringa memorizzata con 'memcpy' e':
valerio²²²²
la stringa memorizzata con 'memmove' e':
valerio²²²²
Premere un tasto per continuare . . .

non mi riesco a rendere conto perche in seguito alla memcpy e alla memmove la stringa mi compare "sporcata " da quei 4 caratteri finali....graiz per la cortese attenzione

Ziosilvio
10-05-2007, 13:52
strlen non conta il carattere nullo finale, quindi, se a=strlen(Pstringa), per allocare spazio sufficiente a contenere una copia di Pstringa devi chiamare malloc(a+1).
Altrimenti, la memoria copiata contiene sì i caratteri di Pstringa prima del NUL, ma la zona successiva contiene un po' di monnezza, più (si spera!) un carattere nullo prima o poi.

Ah: e main deve essere di tipo int.

Piojolopez2406
10-05-2007, 14:02
facendo come dici tu cmq non esce il risultato sperato infatti l'output guarda com'è:

scrivi caratteri:
valerio
la stringa e':
valerio
la stringa memorizzata con 'memcpy' e':
valerio═²²²²
la stringa memorizzata con 'memmove' e':
valerio═²²²²
Premere un tasto per continuare . . .

mi aggiunge un "="....io credo che allochi più memoria di quanto ne serva ma non riesco a capire il perchè.

andbin
10-05-2007, 14:21
facendo come dici tu cmq non esce il risultato speratoCerto, perché anche facendo malloc(a+1); tu poi dopo copi la stringa con memcpy, specificando di copiare solo 'a' bytes. E il nullo finale chi ce lo mette???? Nessuno.
O imposti tu il nullo o usi strcpy().

Piojolopez2406
10-05-2007, 14:23
quindi nel codice cosa devo cambiare....fammi capire....scusa...grazie

andbin
10-05-2007, 14:27
quindi nel codice cosa devo cambiare....fammi capire....scusa...grazieSe copi solo 'a' byte, nessuno mette il nullo finale.

O fai (dopo la memcpy):
STRINGA[a] = '\0';

oppure usi strcpy (che come da specifiche, copia anche il nullo).

Piojolopez2406
10-05-2007, 14:34
grazie mille....ho capito il perchè

Ziosilvio
10-05-2007, 15:51
facendo malloc(a+1); tu poi dopo copi la stringa con memcpy, specificando di copiare solo 'a' bytes. E il nullo finale chi ce lo mette?.
E pure questo è vero :doh:
E sì che bastava suggerire di riscrivere a=strlen(Pstringa)+1 :grrr: