2016-04-15 21 views
-4

Ich versuche, ein C-Programm, das Strings empfängt und speichert sie in Strukturen dynamisch, und nach dem Passieren Strings Teil, ich werde zeigen, Hexe von ihnen wurde am meisten geschrieben. Aber ich habe Probleme, die Zeiger auf Zeiger auf Strukturen zu kodieren. Ich versuche, etwas wie das Bild zu machen, das ich zeichne here.Zeiger auf Zeiger auf Struct

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

struct Word{ 
    char* palavra; 
    int aparicoes; 
} ; 

struct word createWord(char* str){ 
    struct Word *newWord = malloc(sizeof(struct Word)); 
    assert(newWord != NULL); 

    newWord->palavra = strdup(str); 
    newWord->aparicoes = 1; 

    return newWord; 
} 

int main(){ 
    char* tempString; 
    struct Word** lista; 
    int triggrer = 1; 
    int i = 0; 

    while (triggrer == 1) 
    { 
    scanf("%s", tempString); 

    if (strcmp(tempString , "fui") == 0) 
     triggrer = 0; 
    else 
    { 

     while(*(&lista+i*sizeof(lista)) != NULL){ 
      i++; 
     } 

     if(i == 0){ 
      lista = malloc(sizeof(struct Word)); 

     } 
     else{ 
      lista = (struct Word*) realloc(lista, sizeof(struct Word) + i*sizeof(struct Word)); 
     } 

    } 
    } 

    return 0; 
} 
+0

[Deja vu..repeated ...] (http://meta.stackoverflow.com/q/318618/2173917) –

+0

Danke, und sorry für die C- und C++ Tag –

+0

„Ich bin Schwierigkeiten haben "Wo? Gab es einen Fehler? Was war es? –

Antwort

1

Es gibt keine Zuordnung der Zeiger irgendwo.

Sie brauchen etwas wie folgt aus:

lista = (struct Word**) malloc(sizeof(struct Word*)); 
*lista = NULL; 

die oben zuteilen einen Zeiger auf struct auf Zeiger. Der Zeiger auf struct selbst ist null.

Nun, nicht sicher, was Sie von

while(*(&lista+i*sizeof(lista)) != NULL){ 
     i++; 
    } 

erreichen wollen Wenn Sie das Ende von dir Array von Zeigern finden wollen, vorausgesetzt, dass der letzte Zeiger NULL ist, dann ist dies der Code, es zu tun :

while (*(lista + i) != NULL) i++; 

Außerdem gibt es einige Tippfehler im Code. Dies würde kompilieren und arbeiten. Aber ich persönlich empfehle, normales Array von Zeigern zu verwenden (d. H. Einfach die Größe des Arrays in einer anderen Variablen zu halten).

struct Word{ 
    char* palavra; 
    int aparicoes; 
} ; 
struct Word * createWord(char* str){ 
    struct Word *newWord = (struct Word *)malloc(sizeof(struct Word)); 
    newWord->palavra = strdup(str); 
    newWord->aparicoes = 1; 
    return newWord; 
} 
int main() 
{ 
    char tempString[1024]; 
    struct Word** lista; 
    int triggrer = 1; 
    int i = 0; 
    lista = (struct Word**)malloc(sizeof(struct Word*)); 
    *lista = NULL; 
    while (triggrer == 1) 
    { 
scanf("%s", tempString); 

if (strcmp(tempString , "fui") == 0) 
    triggrer = 0; 
else 
{ 

    while(*(lista+i) != NULL){ 
     i++; 
    } 

    lista = (struct Word**)realloc(lista, (i+1) * sizeof(struct Word*)); 
    *(lista+i) = createWord(tempString); 
    *(lista+i+1) = NULL; 
} 
    } 
    return 0; 
} 
+0

Also was du sagst mit while (* (lista + i)! = NULL) i ++; Ist der Zeiger nicht auf die n nächsten Positionen des Speichers ausgerichtet, befinden sich diese n Positionen irgendwo anders im Speicher, und deshalb macht es keinen Sinn, die Größe der Variablen zu verwenden, um zur nächsten Position "zu springen"? –

+0

ja. Nun, lista zeigt auf den ersten Zeiger auf Zeiger. lista + 1 zeigt auf den zweiten Zeiger auf Zeiger und so weiter. * (lista) zeigt auf die erste Struktur, * (lista + 1) zeigt auf die zweite und so weiter. – Jurys