2009-10-10 5 views
0

J'essaie d'allouer un tableau de char * 's dans C. Je connais le nombre de colonnes à l'avance, mais pas les lignes et je veux allouer le rangées au fur et à mesure des besoins.C allocation dynamique pour une grille lorsque les lignes ne sont pas connues

J'ai essayé d'utiliser:

char *(*data)[NUMCOLS]; //declare data as pointer to array NUMCOLS of pointer to char 

data = malloc(sizeof(char*)); 

maintenant, la ligne ci-dessus devrait allouer des données [0] ... correctes? , je dois être en mesure d'utiliser la ligne comme

data[0][1] = strdup("test"); 
. 
.. 
data[0][NUMCOLS-1] = strdup("temp"); 

Je reçois faute de SEG. Je ne suis pas capable de comprendre ce qui ne va pas ici. quelqu'un peut-il s'il vous plaît aider.

Répondre

0

je ferais ceci:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

int main(){ 
    char ***a = NULL; 

    a  = realloc(a, 1 * sizeof(char **)); // resizing the array to contains one raw 
    a[0] = malloc( 3 * sizeof(char *)); // the new raw will contains 3 element 
    a[0][0] = strdup("a[0][0]"); 
    a[0][1] = strdup("a[0][1]"); 
    a[0][2] = strdup("a[0][2]"); 


    a  = realloc(a, 2 * sizeof(char **)); // resizing the array to contains two raw 
    a[1] = malloc( 3 * sizeof(char *)); // the new raw will contains 3 element 
    a[1][0] = strdup("a[1][0]"); 
    a[1][1] = strdup("a[1][1]"); 
    a[1][2] = strdup("a[1][2]"); 

    for(int rows=0; rows<2; rows++){ 
    for(int cols=0; cols<3; cols++){ 
     printf("a[%i][%i]: '%s'\n", rows, cols, a[rows][cols]); 
    } 
    } 
} 
2

Vous n'avez pas alloué suffisamment de mémoire pour les éléments que vous souhaitez stocker. Dans ce cas particulier, ce serait:

data=malloc(sizeof(char*)*NUMCOLS*NUMROWS); 

Pour redimensionner le tableau, vous utilisez:

data=realloc(data,(size_t)sizeof(char*)*NUMCOLS*NEW_NUMROWS); 

Pour en savoir plus (réaffectation) here

+0

'data = malloc (NUMROWS * sizeof * data);' est une autre option. – caf

+0

@caf Tout d'abord, vous obtiendrez une erreur, puisque vous n'avez pas spécifié de type de données pour sizeof. Deuxièmement, quand j'ai dit NUMCOLS, c'était aussi la longueur de cette chaîne particulière. Deuxièmement: dans le contexte de la question de l'OP, "data" est un pointeur donc si les données étaient déjà allouées et que votre code était compilé, il manquerait de mémoire pour l'allouer. – aviraldg

+0

Cette approche est avec des données char ***? ou char * (* data) [] – vyom

Questions connexes