2017-12-03 8 views
0

私は学校のプロジェクトをやっているのに少し問題があります。私の同級生がコピーする可能性があるため、ここにすべてのコードを投稿することはできません。ダイナミックマトリックスを使用したダイナミック構造

私は、その中に変数char ** phrases,int lines(現在のフレーズ数)、int heaplines(max number of lines my char ** phrases can hold)というメッセージという動的構造を作成しました。

私のプログラムは、メッセージを挿入し、メモリを割り当てて、変数ラインを増やすように要求します。これは、彼が現在持っているメッセージの数です。 +10プラスラインを再配分し、ヘプラインを増加させます。しかし、私の本当の問題は、エラーメッセージが表示されるため、ユーザーが挿入した文字列にメモリを割り当てることができないことです。

Incompatible Pointers types "char **" and "char *" 

char ** msgの行列の行を割り当て

MSG->phrases=(char*)malloc((tamphrase+1)*sizeof(char)); 

それは完璧に動作しますが、私はそれが私の上記のコードの行にそのエラーを与えて挿入しようとしている文字列にメモリを割り当てるしようとします。

Btw、どのようにしてフレーズの行列の行を増やすことができますか?たとえば :

MSG->(phrases+i)=(char*)malloc((tamphrase+1)*sizeof(char)); 

(私はこれは間違っている知っているが、私はあなたたちは私が言うことをしようとしているか知っている願っています)

+0

ようになりますあなたのコードを投稿してください。それは答えを得る唯一の方法です – DaFois

答えて

1

MSG->phrases=(char*)malloc((tamphrase+1)*sizeof(char));は次のようになり、それにchar**そうに割り当てるメモリである

MSG->phrases=malloc((tamphrase+1)*sizeof(char*)); 

次に、文字を保持するためにメモリを割り当てます(tamphrase)。

MSG->phrases[i]=malloc((MAXLENOFLINE+1)*sizeof(char)); 

また、あなたはあなたのコードでは、すでに割り当てられたメモリが不足したときに再割り当てについてのアイデアを得るために約reallocをお読みください。

戻り値をmallocにキャストしないでください。不要なので、エラーが発生した場合のエラーを抑制できます。


ポインタの論理を理解すれば、これらの行を書くのに問題はありません。

あなたはphraseschar**です。今、char**が何を持っているか考えてみてください。それはchar*の変数のアドレスを保持します。今度は、それぞれがchar*の変数を保持することができるメモリのチャンクを割り当て、その開始アドレスをphrasesに返します。

他の方法と同じように、char*charという変数のアドレスを保持します。変数charを格納するメモリを割り当てます。開始アドレスをchar*変数に返します。 phrases[i]はそれを保持します。


詳細に入るがなければ、コードの一般的な構造は、この

MSG->phrases=malloc((tamphrase+1)*sizeof(char*)); 
if(MSG->phrases == NULL){ 
    fprintf(stderr,"Error in malloc"); 
    exit(1); 
} 
for(size_t i = 0; i < tamphrase+1; i++){ 
    MSG->phrases[i]=malloc((MAX_LINE_LENGTH+1)*sizeof(char)); 
    if(MSG->phrases[i] == NULL){ 
     fprintf(stderr,"Error in malloc"); 
     exit(1); 
    }  
} 
... 
... 
// do cool stuff 
.. 
.. 

//free the allocated memory 
for(size_t i = 0; i < tamphrase+1; i++){ 
    free(MSG->phrases[i]); 
} 
free(MSG->phrases); 
関連する問題