Newsgroup: it.comp.lang.c
Titolo: giocando con malloc e struct

Ancora io, sempre su strutture e allocazione della memoria.
se definisco un
typedef struct {
				float coord[4];
				int *pointInd;
	} center;
e
center *cluster;
Ho visto che posso allocare lo spazio di cluster con
cluster = malloc(NCENTR * sizeof(center));
giusto? Pero' come faccio ad allocare con malloc lo spazio richiesto da
cluster.pointInd? E questo va fatto prima o dopo aver dato lo spazio a
cluster?
In generale, come si alloca lo spazio per un array _dentro_ ad una
struttura?
dawe
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 E questo va fatto prima o dopo aver dato lo spazio a cluster?
dopo
ciao.

 struttura?
???? La domanda e' un po' ambigua.
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ???? La domanda e' un po' ambigua.
Ehm, scusa...
googleggiando un po' avevo trovato questo:
[cit.]
struct struttura {
                char nome[10];
                float a;
                float array_flex[]
              }
La memoria di una struttura così configurata viene generalmente allocata in
maniera dinamica attraverso malloc(), questa funzione tuttavia non prende in
considerazione la dimensione dell'array flessibile (come potrebbe?) e per
questo è necessario aggiungere la massima dimensione che esso potrà avere
all'interno del nostro programma. Se ad esempio stabiliamo che l'array
flessibile della struttura prima descritta deve contenere al massimo 5
float, possiamo allocare la memoria necessaria alla struttura in questo
modo:
struct struttura *str;
str = (struct struttura *)malloc(sizeof(struttura) + 5*sizeof(float))
[cit.]
ma quando ho provato non ha dato i frutti sperati, andando in segmentation
faullt (quasi alla fine della elaborazione...).
Ciao


 faullt (quasi alla fine della elaborazione...).
Il codice di sotto funziona senza problemi.
<CODE>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
   char nome[30];
   size_t nElems;
   float array_flex[];
} flArr;
int main(void)
{
   size_t idx = 0;
   flArr* floatArrayP = NULL;
   srand(time(NULL));
   floatArrayP = malloc(sizeof(flArr) + 30*sizeof(float));
   if(NULL != floatArrayP)
   {
      strcpy(floatArrayP->nome, "testFloatArray");
      floatArrayP->nElems = 30;
      while(idx < floatArrayP->nElems)
      {
         floatArrayP->array_flex[idx] = (float)rand();
         idx++;
      }
      printf("struct name   %s\n", floatArrayP->nome);
      printf("struct nElems %d\n\n", floatArrayP->nElems);
      idx =0;
      while(idx < floatArrayP->nElems)
      {
         printf("floatArrayP->array_flex[%d] = %lf\n", idx,
floatArrayP->array_flex[idx]);
         idx++;
      }
      free(floatArrayP);
   }
   return 0;
}
</CODE>
HTH


Un momento.
Pare che ci sia un po' di confusione...
Un conto è avere una struttura con dentro un puntatore... un altro conto 
è avere una struttura con dentro un array dinamico.
Nel secondo caso va bene la soluzione che hai trovato googlando:
struct struttura
{
    char nome[10];
    float a;
    float array_flex[];
};
in questo caso non sapendo a priori quanta memoria ti occuperà 
l'array_flex, tantovale che riservi per quella struttura un quantitativo 
massimo; ma così dichiarata la struttura prevede che al SUO INTERNO 
verrà usato l'array_flex:
  _ _ _ _ _ _ _ _ _ _    _ _ _ _    _ _ _ _    _ _ _ _    _ _ _ _
|_|_|_|_|_|_|_|_|_|_|  |_|_|_|_|  |_|_|_|_|  |_|_|_|_|  |_|_|_|_|
  nome[10]               a          flex[]
(ogni quadretto vale un byte).
In questo caso hai supposto di avere massimo 3 elementi nel vettore 
flex, e quindi la memoria all'interno della struttura prevede 3 spazi 
per flex[];
Caso diverso è il tuo, in quanto hai dichiarato un "puntatore a interi" 
chiamato pointId; così facendo hai detto che nella struttura pointId 
conterrà l'indirizzo di una zona di memoria in cui ci saranno i dati, 
non conterrà i dati veri e proprio come se fosse un array flessibile. 
Non puoi quindi (e non devi) riservare memoria da usare DENTRO la 
struttura, ma riservare tanta memoria quanta ne richiede la tua 
struttura e POI chiedere il quantitativo che ti serve per i dati, e 
associare l'indirizzo ottenuto da malloc all'elemento pointId della tua 
struttura.
Se non sono stato chiaro fammi sapere...
-- 
Quando noi ignoranti eravamo di più, tutto era più bello (A. Celentano).
  ___   _   ___ _  _______   _______ ___
|   \ /_\ | _ \ |/ / _ ) \ / /_   _| __|
| |) / _ \|   / ' <| _ \\ V /  | | | _|
|___/_/ \_\_|_\_|\_\___/ |_|   |_| |___|
--
GIGAMAIL By X-Privat - 
http://www.x-privat.org/gigamail.php