2013-01-11 4 views
1

Je veux créer un tableau de caractères char ** sur la pile. À l'heure actuelle, j'utilise, mais je me demande s'il y a une plus belle façon:Meilleure façon de créer un tampon char ** sur la pile?

char* buf[4]; 
char temp0[1024], temp1[1024], temp2[1024], temp3[1024]; 
buf[0] = temp0; 
buf[1] = temp1; 
buf[2] = temp2; 
buf[3] = temp3; 

EDIT: Pour être plus clair, je ne peux pas simplement utiliser char buf[4][1024]. Une fonction qui attend un tableau de pointeurs char se bloquerait, car c'est un type de données fondamentalement différent. Voilà comment je créerais le tableau sur le tas:

char** buf = malloc(sizeof(char*) * 4); 
for(int i = 0; i < 4; i++) 
{ 
    buf[i] = malloc(sizeof(char) * 1024); 
} 

Répondre

2

Les solutions affichées à ce jour sont à la fois sur OK pour 4 éléments; pour 10 ils sont maladroits, et pour 100 ne pas voler. Je pense que cela peut évoluer mieux:

enum { MAX_ROWS = 10, ROW_SIZE = 1024 }; 
char bigbuffer[MAX_ROWS][ROW_SIZE]; 
char *buf[MAX_ROWS]; 

for (int i = 0; i < MAX_ROWS; i++) 
    buf[i] = bigbuffer[i]; 

...and off you go... 

C99 ou plus tard, vous pouvez paramétrer la taille du tableau à l'aide Vlas (tableaux de longueur variable):

void buffer_creation(int rows, int cols) 
{ 
    char bigbuffer[rows][cols]; 
    char *buf[rows]; 

    for (int i = 0; i < rows; i++) 
     buf[i] = bigbuffer[i]; 

    ...and off you go... 
} 

Si la taille est trop grande, vous pouvez utiliser malloc() à la place, bien sûr, mais vous devez vous assurer que vous libérez l'espace aussi:

void buffer_creation(int rows, int cols) 
{ 
    char *buf[rows]; // Probably won't stress the stack ever 
    char *bigbuffer = malloc(rows * cols); 
    if (bigbuffer != 0) 
    {  
     for (int i = 0; i < rows; i++) 
      buf[i] = &bigbuffer[i * cols]; 

     ...and off you go... 
     free(bigbuffer); 
    } 
} 

de toute évidence, vous pouvez allouer le tableau buf trop si vous Je veux vraiment - je le laisse comme un exercice pour le lecteur.

+0

Près d'un -1 pour l'utilisation inappropriée (ab) de 'enum' pour des constantes non énumérées, non-énumérées ... mais le reste de la réponse est bon. – Andrew

1

Shouldnt simple travail char buf[4][1024]; tout aussi bon?

+0

Désolé, j'aurais dû être plus clair. J'ai besoin d'un tableau de pointeurs char, dont chacun pointe vers un tampon séparé. – charliehorse55

+1

@ charliehorse55 buf [0], buf [1], buf [2], buf [3] sont tous de type char * –

+0

Oui, mais il ne fera que créer un tableau de 4096 caractères à la suite. Lorsque vous essayez de le passer à une fonction, il se désintègre en un tableau à une dimension de 4096 caractères. – charliehorse55

0

Une version légèrement meilleure:

char temp0[1024], temp1[1024], temp2[1024], temp3[1024]; 
char *buf[4] = {temp0, temp1, temp2, temp3}; 
Questions connexes