Newsgroup: it.comp.lang.c
Titolo: Allocare dinamicamente un array di stringhe

Ho il seguente problema: devo leggere una serie di dati di tipo stringa
da un file, e fin qui tutto bene, una volta calcolato il numero totale
di elementi dovrei allocare dinamicamente un array di stringhe (un array
di caratteri bidimensionale), e non riesco a farlo, il programma
restituisce sempre segmentation fault... Mi sto scervellando.
Ricordo che una volta con un problema analogo col borland (sotto dos)
riusci' nell'intento, forse con qualche artificio che ora non ricordo...
Preciso che devo utilizzare il linguaggio c e non il c++.
Qualcuno di voi mi manderebbe un esempietto che mi aiuti a risolvere il
problema?
Grazie anticipatamente

 qualche artificio che ora non ricordo...
  Hai una serie di possibilita` (che ti elenco):
	- Allochi un array monodimensionale ed usi il "new line" 
	per separare le varie stringhe: in pratica, leggi il file 
	in memoria;
	- Crei una lista-di-record-e-puntatori, ogni record 
	contiene un un vettore in cui c'e` la stringa ed un 
	puntatore al successivo record;
	- Allochi un vettore di puntatori (tanti quante sono 
	le stringhe) e poi, per ogni stringa, allochi un 
	vettore puntato dal puntatore in questione.
  Niente esempi: sono le 18:08, ho lottato tutto il giorno con i miei
dannati server e non so cosa verrebbe fuori. ;)
	Alla prossima,
		Marco

 restituisce sempre segmentation fault...
Forse sarebbe meglio che ci facessi vedere come hai fatto. Comunque, se
le stringhe sono a lunghezza variabile forse ti conviene allocare prima
un array di puntatori a carattere (char *a[ nn ]) e poi, per ogni
elemento di questo, allocare un array di caratteri atto a contenere la
stringa che ti interessa memorizzare a quella posizione.
EMG

Se sei sotto windows l'allocazione dinamica deve seguire delle regole ben
precise: non si puň richiamare malloc. Puň essere questo il tuo problema?
ciao, Marco Altieri

you wrote :
#Ho il seguente problema: devo leggere una serie di dati di tipo stringa
#da un file, e fin qui tutto bene, una volta calcolato il numero totale
#di elementi dovrei allocare dinamicamente un array di stringhe (un array
#di caratteri bidimensionale), e non riesco a farlo, il programma
#restituisce sempre segmentation fault... Mi sto scervellando.
#Ricordo che una volta con un problema analogo col borland (sotto dos)
#riusci' nell'intento, forse con qualche artificio che ora non ricordo...
Avendo 
char **sa ;
int i ;
utilizzi
sa = malloc( numero di stringhe * sizeof (char *) );
poi un ciclo del tipo :
for (i = 0 ; i < numero di stringhe ; i++ ) 
    sa[i] = malloc( lunghezza stringa ) ;
Andrea Laforgia        (
andrea_...@bigfoot.com
)
----------------------------------------------------
There is nothing better for understanding a kangaroo
than seeing it jump.
----------------------------------------------------

 
se 
	len e' la lunghezza di ogni stringa
	n e' il numero di stringhe
	char **ch e' la matrice
ch = (char **) malloc (n * len);
bye ;-)
-- 
Emanuele Cesena                 
http://www.penguinpowered.com/~ecesena
ece...@penguinpowered.com
                 Attenti all'antispam NOSPAM
Colmo di un intellettuale di sinistra: farsi pagare in nero.
		-- Da it.hobby.umorismo

Sono sotto unix, i file che devo leggere sono i file contenenti gli utenti ed
i gruppi.

Ho provato gia' qualcosa di analogo, ma mi pare che non abbia ottenuto grossi
risultati.... ti faro' sapere.

 dannati server e non so cosa verrebbe fuori. ;)
Fa niente, grazie lo stesso.

 wrote:
NR>Ho il seguente problema: devo leggere una serie di dati di tipo stringa
NR>da un file, e fin qui tutto bene, una volta calcolato il numero totale
NR>di elementi dovrei allocare dinamicamente un array di stringhe (un array
NR>di caratteri bidimensionale)
Non so se ho capito bene. Intendi qualcosa del genere ?
------------------------------------------------------------------------
/* Legge da stdin e memorizza un file di testo, restituendo un */
/* puntatore ad un array di stringhe terminato da NULL.        */
/* (C) 1999 Andrea Foco  -- fok(at)
lycosmail.com
               */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct lista {
        char *str;
        struct lista *next;
} *base;
int main()
{
        char buffer[2048], **array;
        int count = 0;
        base = NULL;
        while (fgets(buffer, sizeof buffer, stdin)) {
                struct lista *newl = malloc(sizeof(struct lista));
                if (newl == NULL) {
                        perror("malloc"); exit(1);
                }
                newl->str = strdup(buffer);
                if (newl->str == NULL) {
                        fputs("strdup\n", stderr); exit(1);
                }
                newl->next = base;
                base = newl;
                count++;
        }
        array = malloc(sizeof(char *) * (count+1));
        if (array == NULL) {
                perror("malloc"); exit(1);
        }
        array += count;
        *array = NULL;
        while (base) {
                struct lista *tmp;
                *--array = base->str;
                tmp = base;
                base = base->next;
                free(tmp);
        }
        /* fai qui quello che ti serve...*/
        {
                char **tarray = array;
                while (*tarray)
                        fputs(*tarray++, stdout);
        }
        /*... e alla fine */
        while (*array)
                free(*array++);
        return 0;
}
------------------------------------------------------------------------
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

 Grazie anticipatamente

Problema risolto.
Con le tue istruzioni ho risolto il problema, probabilmente avevo combinato
qualche pasticcio con i puntatori.
Grazie.