2017-12-12 26 views
-1

私の悪い英語のために申し訳ありませんが、私はあなたのための質問があります。私は、メモリを節約するために文字列へのダブルポインタの配列を持つプログラムを書いたが、私は質問がある。 colnameのcallocでポインタが正しいですか? 'frutta'では、プログラムが動作します。あなたの助けを前もってありがとう!このいや文字列へのダブルポインタの配列にメモリを割り当てる?

#include <stdio.h> 
#include <stdlib.h> 
void inserimento (char **, int); 
void output (char **, int); 
int main() 
{ 
char **frutta; 
int n,i; 
printf("Quanta frutta vuoi inserire?\n"); 
scanf("%d",&n); //with this I write here number of elements 
//(with 4 for example I write 4 fruit names) 
frutta=(char **)calloc(frutta,sizeof(char*));//calloc for col. Name pointer 
//here is correct? 
for (i=0;i<n;i++) 
frutta[i]=(char *)calloc(n,sizeof(char));//calloc for row 
inserimento (frutta,n); 
output (frutta,n); 
for (i=0;i<n;i++) 
free(frutta[i]); 
free(frutta); 
} 
void inserimento (char **frutta, int n) 
{ 
int i; 
for (i=0;i<n;i++) 
scanf("%s",frutta[i]);//here add name fruits 
} 
void output (char **frutta, int n) 
{ 
int i; 
for (i=0;i<n;i++) 
printf("%s",frutta[i]);//here print name fruits 
} 
+0

いいえ、それは正しくありませんし、あなたのコンパイラは、あなたがそれをaboit警告する必要があります。 (そうでない場合は、より良いコンパイラを入手してください)。ドキュメントを読んで、callocが意味する2つのパラメータを確認してください。 –

+0

さらに、 'frutta [i] =(char *)calloc(n、sizeof(char))'は疑わしいです。文字列の数と各文字列の長さの間に自然なリンクはありません。 –

答えて

0
//here is correct? 
for (i=0;i<n;i++) 

ではありません。それを正しくするためには、nポインタ用のメモリを割り当てる必要があります。 (あなたは最初にcallocをやっていませんでした)。

frutta=calloc(n,sizeof(char*)) 

構文が間違っていました。警告/エラーがあります。

すべての-Wallフラグを使用してプログラムをコンパイルするようにしてください。そして、あなたが得るすべての警告を確認することを忘れないでください。これらの場合、それはあなたを助けます。


標準7.22.3.2

void *calloc(size_t nmemb, size_t size); 

からcalloc関数は、そのサイズの各サイズあるnmemb個のオブジェクトの配列、 ためのスペースを割り当てます。スペースはすべてのビットが

つ以上のものをゼロに初期化されます。 -

  1. いけないcallocの戻り値をキャスト。

  2. callocの戻り値を確認してください。

  3. 割り当てられたメモリは、作業が完了したら解放します。

はい!私は1つの追加ポイントを作った。

0
frutta=(char **)calloc(frutta,sizeof(char*)); 

正しくありません。コンパイラの警告が原因で存在します。説明したように、最初の引数として整数を必要のcalloc:

ボイド*とのcalloc(size_tのnmemb個、size_tのサイズ)。

0

これは間違いです。 callocの最初のパラメータはメンバーの数です。ポインタを渡すと、この時点では定義された値がありません。

frutta=(char **)calloc(frutta,sizeof(char*)); 

代わりに、あなたはあなただけで読んだnを使用します。

frutta=calloc(n,sizeof(char*)); 

は第二に、ダウン次のレベルのために、あなたはおそらく、あなたがそこに実際の文字列を格納するつもりならnより多くの大きな何かをしたいです。あなたの4の例は、NUL終端文字のためのスペースを含める必要があるので、3文字の長さの文字列を格納するスペースしか与えません。

frutta[i]=(char *)calloc(n,sizeof(char)); 

また、それを必要としないだとしてcalloc(またはmalloc)の戻り値をキャストしてはならないし、あなたのコード内のエラーを非表示にすることができます。

関連する問題