2011-02-25 6 views
1

Je veux avoir un tableau char 2d, et quand je n'utilise pas la structure, je peux faire une boucle dans le tableau et imprimer les chaînes. Cependant, si j'affecte le tableau 2d char à un membre struct, je ne peux pas accéder au tableau, pourquoi?C: Comment stocker un tableau Char 2d dans une structure?

typedef struct { 
    int num; 
    char **names; 
} test; 


test t; 
t.num = 2; 
char *names[t.num]; 
char *tmp; 
tmp = "test"; 

names[0] = "something"; 
strcpy(tmp,names[0]); 
strcat(tmp,"appendedtext"); 
names[1] = tmp; 
names[2] = "something else"; 


t.names = names; 
+0

Pouvez-vous fournir l'erreur exacte que vous obtenez? – maerics

Répondre

1

ne devrait pas vous souvenir alloc pour vos tableaux avant d'essayer d'y accéder?

EDIT:

names[2] = "something else" vous sort de l'index .. vous déclarez seulement un tableau 2 de chaîne.

Puisque vous avez dit que la mémoire est automatiquement déclarée comme une constante, alors vous devriez avoir remarqué:

char *tmp; 
tmp = "test"; 

strcpy(tmp, "something"); //something is longer than test 
+0

oui il devrait :) – svens

+1

autant que je sache la mémoire est déclarée automatiquement comme une constante lors de faire char * s = "quelque chose" – Marcus

+2

Ce n'est pas que c'est plus long c'est le problème. C'est le comportement indéfini invoqué en modifiant le tableau sauvegardant un littéral de chaîne. Dans ce cas, undefined signifie segfault. – aaz

2

Vous devriez vraiment allouer dynamiquement vos tableaux ici. Il y a beaucoup de problèmes avec les choses que vous essayez de faire ici.

  • Votre tableau est initialisé pour pointer vers la mémoire de la pile.
  • Vous stockez des pointeurs vers des littéraux de chaîne et tentez de les modifier.
  • Vous accédez à la mémoire au-delà des limites de votre baie.
  • Et tout le reste.

Il se trouve que j'ai quelques fonctions utilitaires pour allouer dynamiquement des tableaux bidimensionnels en utilisant une seule allocation. N'hésitez pas à les utiliser dans votre code.

static size_t getsize(size_t rows, size_t cols, size_t size) 
{ 
    size_t ptrsize = rows*sizeof(void *); 
    if (ptrsize%size != 0) 
     ptrsize += size - ptrsize%size; 
    return ptrsize + rows*cols*size; 
} 

static void init2d(void *mem, size_t rows, size_t cols, size_t size) 
{ 
    int i; 
    char **ptr = mem; 
    char *base = (char *)(ptr + rows); 
    size_t rowsize = cols*size; 
    size_t ptrsize = rows*sizeof(char *); 
    if (ptrsize%size != 0) 
     base += size - ptrsize%size; 
    for (i = 0; i < rows; i++) 
     ptr[i] = base + i*rowsize; 
} 

void *malloc2d(size_t rows, size_t cols, size_t size) 
{ 
    size_t total_size = getsize(rows, cols, size); 
    void *mem = malloc(total_size); 
    init2d(mem, rows, cols, size); 
    return mem; 
} 

void *calloc2d(size_t rows, size_t cols, size_t size) 
{ 
    size_t total_size = getsize(rows, cols, size); 
    void *mem = calloc(total_size, 1U); 
    init2d(mem, rows, cols, size); 
    return mem; 
} 

Alors votre code ressemblerait à quelque chose comme ceci:

#define MAXWIDTH 100 
int num = 3; 
test t; 
t.num = num; 

/* dynamically allocate the memory for t.name */ 
t.names = calloc2d(t.num, MAXWIDTH, sizeof(char)); 

/* do your thing here */ 
const char *tmp = "test"; 
strcpy(t.names[0], tmp); 
strcat(t.names[0], "appendtext"); /* just be careful not to go past MAXWIDTH */ 

strcpy(t.names[1], tmp); 

strcpy(t.names[2], "something else"); 

/* free the memory that was allocated when done */ 
free(t.names);  
t.names = NULL; 
Questions connexes