|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Oct 2005
Messaggi: 55
|
[C]aiuto per esercizio
Salve a tutti, avrei bisogno di una mano con un esercizio C riguardo l'allocazione dinamica della memoria visto che tra poco ho l'esame appunto di C.
Premetto che ho iniziato a programmare da relativamente poco, quindi mi scuso se vi potrà sembrare una cosa banale o stupida ma io è un po che provo a far funzionare questo programma e non ci riesco L'esercizio è il secondo di questa pagina: http://www.informatica.uniroma2.it/u.../IIappello.pdf Quello che volevo provare a fare io era creare un vettore di stringhe (con dimensione immesa da input), con la dimensioni delle singole stringhe a loro volta immesse da input. Il fatto però è che non ho per niente dimestichezza con l'allocazione dinamica della memoria (come scritto prima ho iniziato a programmare da poco), quindi la mia idea potrebbe essere semplicemente implementata male, oppure sballata sin dal principio, ditemi voi. Questo è il codice: Codice:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
int main()
{
char *str, *p;
int nstr, lstr, i;
printf("Quante stringhe vuoi inserire: \n");
scanf("%d", &nstr);
if (nstr > 0) {
str = (char *) calloc(nstr, sizeof(char *)); /* dovrebbe allocare memoria
per un vettore di NSTR stringhe */
for ( i = 0; i < nstr; i++) {
printf("Quanto e' lunga la prossima stringa? \n");
scanf("%d", &lstr);
p = (char *) calloc(lstr, sizeof(char)); /*dovrebbe allocare memoria per la stringa lunga LSTR */
scanf("\n");
gets(p);
str[i] = (char *) calloc(lstr, sizeof(char)); /*dovrebbe allocare memoria per la stringa da copiare in str[i] */
strcpy(str[i], p); /*copio p in str[i] */
free(p);
}
}
for(i = 0; i < nstr; i++)
puts(str[i]);
for(i = 0; i < nstr; i++)
free(str[i]);
system("PAUSE");
return 0;
}
Spero che non lo troviate troppo ridicolo Cmq ad intuito direi che sbaglio sicuramente qualcosa nell'usare la variabile str, no? Ultima modifica di ---Kat999--- : 24-05-2007 alle 15:21. |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Di do un indizio:
Quote:
Secondo indizio: str deve essere char **
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Io aggiungo:
- se allochi dinamicamente spazio per la stringa devi allocare 1 byte in più per contenere il carattere nullo. Nel tuo caso 'lstr' immagino che sia il numero di caratteri escluso il nullo, quindi nella allocazione devi fare lstr+1. - gets() è insicura, usa fgets, specificando come stream 'stdin'. - potresti anche evitare di allocare ad ogni ciclo un blocco di memoria temporaneo.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Oct 2005
Messaggi: 55
|
grazie per i consigli, in effetti bastava dichiarare str come ** e il programma funzionava. Poi seguendo gli altri consigli ho usato fgets ed eliminato *p che non serve a nulla
Anche se effettivamente non capisco bene perchè con l'uno va e l'altro no, praticamente con **str dichiaro un puntatore che contiene come valore a sua volta l'indirizzo di un altro puntatore? Cioè se avessi saputo già quante stringhe c'erano da memorizzare, invece che saperlo da input, mi sarebbe bastato dichiarare che ne so *str[4] e il progr. avrebbe funzionato no? Perchè per farlo dinamicamente devo dichiarare invece **str? Poi un altra cosa: quando libero memoria per str alla fine, devo fare il ciclo Codice:
for ( i = 0; i < nstr; i++) free(str[i]); Grazie per gli aiuti. |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Mentre char **str vuol dire "un puntatore a puntatore a char". In questo caso devi allocare prima un array di puntatori con: str = (char **) calloc(nstr, sizeof(char *)); e poi ad ogni puntatore dell'array devi assegnare il puntatore ad un array di char (per le stringhe). In pratica sei in una situazione di questo tipo: ![]() Devi prima deallocare gli array relativi alle stringhe e poi deallocare l'array principale.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Oct 2005
Messaggi: 55
|
perfetto, tutto claro, mucho thk
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:42.





















