2010-09-03 8 views
2

J'ai défini struct commeComment copier tableau de struct en C

typedef struct { 
    char *oidkey; 
    int showperf; 
    char oidrealvalue[BUFSIZE]; 
    char *oidlimits; 
} struct_oidpairs; 

et je tableau de struct

struct_oidpairs b[] ={{.....},....} 

et je veux le copier sur new struct array a[]

s'il vous plaît aider

+0

Quel est le point de struct 'typedef {... } struct_oidpairs'? Pourquoi ne pas simplement 'struct oidpairs {...}'? – JeremyP

+1

@JeremyP: Ce ne sont pas les mêmes en C. – AnT

+2

Oui, ils le sont. La différence est que dans un cas, vous tapez un espace (ou toute quantité d'espace blanc) entre la structure et les oidpairs. Dans l'autre cas, vous tapez un trait de soulignement. – JeremyP

Répondre

2

Quelque chose comme ceci:

memcpy(dest, src, sizeof(struct) * sizeof(src)); 
+2

Cela ne fonctionnera pas comme prévu si oidkey et oidlimits sont des chaînes allouées dynamiquement. –

+1

Il fait une copie superficielle de la structure, ainsi il copie les * pointeurs *, pas le contenu des chaînes. – Sjoerd

+0

Oui, tant que 'oidkey' et' oidlimits' sont des constantes et ne sont pas susceptibles d'être modifiées dans la version copiée du tableau ET les deux sources pendant la durée de vie du tableau copié – mmonem

-5

en utilisant peut-être:

for(int i=0; i<b.size() ;i++) 
//I am not sure if this is the correct name for the size function 
{ 
a[i]=b[i]; 
} 
2

Votre struct contient des pointeurs en tant que membres de données, cela signifie que vous devrez déployer votre propre fonction de copie qui fera quelque chose de sensible avec les pointeurs. memcpy ne fonctionne que toutes les données liées à la structure est stockée dans la structure.

1

Pour une réelle copie du contenu, suivez la réponse de Sjoerd puis:

for (i = 0; i < sizeof(src); i++) 
{ 
    if (src[i].oidkey != NULL) 
    { 
     dest[i].oidkey = malloc(strlen(src[i].oidkey) + 1); 
     strcpy(dest[i].oidkey, src[i].oidkey); 
    } 

    if (src[i].oidlimits != NULL) 
    { 
     dest[i].oidlimits = malloc(strlen(src[i].oidlimits) + 1); 
     strcpy(dest[i].oidlimits, src[i].oidlimits); 
    } 
} 

Vous memcpy peut considérer si vous êtes intéressé par la vitesse.

Mise à jour:

  • Après le code « harper, je mis à jour le code pour vérifier NULL pointeurs
  • Ceci est une note cité gordongekko:

    Cette solution planter si oidkey ou oidlimits sont != NULL et non '\0' signifie ne pas initialisés à terminaison

+0

Vous devez rechercher des pointeurs NULL dans oidkey et oidlimits pour éviter un comportement indéfini (c'est-à-dire une erreur de page). Vous pouvez considérer strdup au lieu de malloc + strcpy pour réduire les lignes de code. Et vous pouvez utiliser strdup au lieu de malloc + strcpy pour enregistrer des lignes de code. – harper

+0

votre solution va planter si oidkey/oidlimits sont! = NULL et pas '\ 0' terminé signifie pas initialisé. – user411313

+0

@harper: 'strdup' n'est pas une fonction standard. En d'autres termes, il n'y a pas de fonction comme 'strdup' dans C. – AnT

0

Makes pas une copie complète:

struct_oidpairs b[] = {...}; 
size_t len = sizeof b/sizeof*b; 
struct_oidpairs *a = malloc(sizeof b); 

if(!a) /* ERROR handling */ 

memcpy(a, b, sizeof b); 
... 
free(a); 

ou

while(len--) 
    a[len] = b[len]; 
... 
free(a);