2017-10-19 39 views
1

Say, j'ai quelques struct comme ceci:Comment struct malloc avec des tableaux avant strncpy

struct address 
{ 
    char city[40]; 
    char street[40]; 
    double numberofhouses; 
}; 

struct city 
{ 
    struct address * addresslist; 
    unsigned int uisizeadresslist; 
    unsigned int housesinlist; 
}; 

struct city *city= malloc(sizeof(struct city); 

Je veux initialiser de la manière que je peux écrire 30 adresses à la struct. Je lis les adresses d'un fichier .txt et les écris dans la structure. Si nécessaire, je veux également dynamiquement réaffecter plus de mémoire pour lire toutes les adresses. Je suis nouveau à malloc et ai également recherché quelques exemples. Mais la façon dont je les ai adaptés a toujours échoué.

Où est-ce que je fais quelque chose de mal? Il semble qu'aucune mémoire ne soit allouée et donc la commande strncpy échoue à écrire dans la structure. Si j'utilise la structure statique, tout fonctionne correctement.

+1

"Je lis les adresses d'un fichier .txt et les écris dans la structure." -> publie le code qui le fait. "La façon dont je les ai adaptés a toujours échoué." poster cette tentative a échoué. "Où je fais quelque chose de mal?" -> vous ne publiez pas assez de code pour montrer le problème. – chux

Répondre

0

struct address* addresslist est lui-même un pointeur à l'intérieur struct city, vous devez malloc mémoire pour cela aussi si vous voulez enregistrer struct address types.

#define NUM_ADDRESSES 30 

struct city *city= malloc(sizeof(struct city); 
if (city != NULL) 
{ 
    city->addresslist = malloc(sizeof(struct address) * NUM_ADDRESSES); 
    if (city->addresslist == NULL) 
    { 
    // handle error 
    } 
} 
else 
{ 
    // handle error 
} 

// now I can safely strcpy into the city->addresslist. Just be sure not 
// to copy strings longer than 39 chars (last char for the NUL terminator) 
// or access addresses more than NUM_ADDRESSES-1 
strcpy(city->addresslist[0].city, "Las Vegas"); 
strcpy(city->addresslist[0].street, "The Strip"); 
.... 

// things have changed, I need to realloc for more addresses 
struct address newAddrs* = realloc(city->addresslist, NUM_ADDRESSES*2); 
if (newAddrs != NULL) 
{ 
    city->addresslist = newAddrs; 
} 
else 
{ 
    // handle error 
} 

.... 

free(city->addresslist); 
free(city);