2016-04-15 29 views
-4

文字列を受け取って構造体に動的に格納するCプログラムを実行しようとしていますが、渡す文字列部分の後に、それらの魔法使いが最も書き込まれたことを示します。しかし、構造体へのポインタへのポインタのコーディングに問題があります。私はhereを描くイメージのようなものをしようとしています。構造体へのポインタへのポインタ

#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; 

上記の構造体へのポインタを1つのポインタを割り当てる:

あなたはこのようなものが必要。構造体自体へのポインタは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

だからあなたが言っているのは ですが、(*(lista + i)!= NULL)i ++; ポインタはメモリの次のn個の位置を指していません。このn個の位置はメモリ内のどこかにあります。なぜ、変数のサイズを次の位置に「ジャンプ」するのに意味がありませんか? –

+0

はい。まあ、listaはポインタの最初のポインタを指しています。 lista + 1はポインタへの2番目のポインタを指しています。 *(lista)は最初の構造体を指し、*(lista + 1)は2番目の構造体を指します。 – Jurys