2017-05-15 4 views
-1

Ich habe ein dynamisches Array mit Anfangsgröße implementiert und fügen Sie ein Array von zwei Spalten in so etwas wie {{"aa","bb"},{"cc","dd"},{"ff","gg"}} hier ist mein code.the Element sieht zu Coorectly in Array speichern, aber ich weiß nicht wie um die Elemente wie ptr_arr[i][j] zu erhalten.bekommen char-Element wie Array in c

typedef struct { 
    char **array; 
    size_t used; 
    size_t size; 
} Array; 

void initArray(Array *a, size_t initialSize) { 
    a->array = (char **)malloc(initialSize * sizeof(char *)); 
    int i; 
    for (i = 0; i < 2; i++) { 
     a->array[i] = (char *) malloc(initialSize * sizeof(char *)); 
    } 
    a->used = 0; 
    a->size = initialSize; 
} 

void insertArray(Array *a, char* (*element)[2]) { 
    if (a->used == a->size) { 
     a->size *= 2; 
     a->array = (char **)realloc(a->array, a->size * sizeof(char)); 
    } 
    a->array[a->used++] = *(*element); 

} 

int main(int argc, const char * argv[]) { 
    Array ptr_arr; 
    initArray(&ptr_arr, 1); 
    char *b[] = {"85","9u"}; 
    insertArray(&ptr_arr, &b); 
    printf("%s \n", (ptr_arr.array[0][1])); //this is just i want to use 
    return 0; 
} 
+0

'a-> array = (char **) malloc (Urspr * sizeof (char *));' -> 'a-> array = malloc (sizeof * (a -> array) * 2); ' – chux

+0

@chux was ist das problem? ich habe es nicht verstanden. –

+0

Ihr Code 'malloc (initialSize * sizeof (char *))' weist 1 Zeiger zu. 'malloc (sizeof * (a-> array) * 2)' 'ordnet 2 Zeiger zur Verwendung im folgenden' zu (i = 0; i <2; i ++) {' – chux

Antwort

0

ein 2-dimensionales Array ist ein Array von Zeigern auf andere Arrays. Um dies dynamisch zu tun, müssen Sie für jede Zeile ein eindimensionales Array und ein eindimensionales Array zuweisen, um die Zeiger für diese Arrays (Linien) zu halten. Etwas wie:

char **Array; 
char *Array_line; 

Array = malloc(initialSizeY * sizeof(char *)); 

for(int i=0; i<initialSizeY; i++) 
{ 
    Array_line = malloc(initialSizeX * sizeof(char)); 
    Array[i] = Array_line; 
} 

Dann könnten Sie Ihre Daten acces Array [i] [j] wo i verweist auf die i-te Zeile des Arrays und j ist die j-te Char dieser Linie.

Um dieses Array zu befreien, sollten Sie es zuerst crawlen, jede Zeile davon frei (Array [i]) und dann das Zeigerhalter-Array (Array) freigeben.

+0

danke, aber ich mache so etwas in meinem Code. –

+0

Detail: 'int a [3] [4]' ist ein Beispiel für ein 2D-Array. Mit 'char ** Array;' ist 'Array' kein 2D-Array, sondern ein Zeiger auf ein' char * '. – chux

+0

@mike fayya - Was genau brauchst du? - Ein zweidimensionales Array von Zeichen, ein eindimensionales Array von Strings oder ein zweidimensionales Array von Strings? In Ihrem main() 'printf ("% s \ n ", (ptr_arr.array [0] [1])); würde versuchen, auf ein 2D-String-Array zuzugreifen, das ein 3D-Array von Zeichen ist! –

1

ähnliche

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

typedef struct { 
    char* (*array)[2]; 
    size_t used; 
    size_t size; 
} Array; 

void initArray(Array *a, size_t initialSize) { 
    a->array = malloc(initialSize * sizeof(char *[2])); 
    a->used = 0; 
    a->size = initialSize; 
} 

void insertArray(Array *a, char* (*element)[2]) { 
    if (a->used == a->size) { 
     a->size *= 2; 
     a->array = realloc(a->array, a->size * sizeof(char *[2])); 
    } 
    a->array[a->used][0] = element[0][0]; 
    a->array[a->used++][1] = element[0][1]; 
} 

int main(int argc, const char * argv[]) { 
    Array ptr_arr; 
    initArray(&ptr_arr, 1); 
    char *b[] = {"85","9u"}; 
    insertArray(&ptr_arr, &b); 
    printf("%s \n", (ptr_arr.array[0][1]));//9u 
    free(ptr_arr.array); 
    return 0; 
}