2016-04-15 294 views
-4

我正在試圖做一個接收字符串並將它們動態存儲到結構中的C程序,並且在傳遞字符串部分之後,我將顯示它們的巫婆寫得最多。但我在編寫指向結構指針的指針時遇到了麻煩。我正在嘗試做類似於我繪製的圖像here指向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

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

+0

謝謝,對不起,C和C++標籤 –

+0

「我有麻煩「在哪裏?有錯誤嗎?它以前如何? –

回答

1

指針在任何地方都沒有分配。

你需要的東西是這樣的:

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

上述分配一個指針,指針結構。指向結構本身的指針爲null。

現在,不知道你想如果你想找到你的指針數組的末尾,假設,最後指針爲NULL通過

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

達到什麼樣的,那麼這是代碼來做到這一點:

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

此外,代碼中還有一些拼寫錯誤。這將編譯和工作。但我個人建議使用普通的指針數組(即只將數組的大小保存在另一個變量中)。

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

所以你在說什麼 while(*(lista + i)!= NULL)i ++; 是指針指向內存的下n個位置,這n個位置是在內存中的其他位置,這就是爲什麼沒有意義使用變量的大小來「跳」到下一個位置? –

+0

是的。好吧,lista指向指向指針的第一個指針。 lista + 1指向指針的第二個指針等等。 *(lista)指向第一個結構體,*(lista + 1)指向第二個結構體,依此類推。 – Jurys