2017-01-21 4 views
-10
int a[10]; 

上記のコードは、4つの整数可変サイズ&の配列を作成し、プログラムは4つの整数しか格納できません。 は今、コードの上の部分は、4つのint型のポインタ&を作成します動的メモリ割り当ては、実行時にメモリを割り当てる方法を教えてください。

int *a,*b,*c,*d; 
a= (int *)malloc(sizeof(int)); 
b= (int *)malloc(sizeof(int)); 
c= (int *)malloc(sizeof(int)); 
d= (int *)malloc(sizeof(int)); 

次のコマンドを検討し、それらをint型のサイズのメモリを割り当てます。 ダイナミックメモリ割り当てでは、ラムタイムにメモリが割り当てられることが分かりました。 配列やmalloc(動的メモリ割り当て)を使用しているかどうかにかかわらず、ユーザーはint型のサイズのメモリを4つしか取得できないことを知りたいと思います。int型メモリを持つポインタ変数であると判断した場合、どちらの場合でも、ユーザは4つのintスペース&を取得し、彼はソースコードにアクセスする必要があります。なぜ我々はmallocまたは動的メモリ割り当てを使用するのですか?

+4

「10」と「4つの整数しか格納できません」の関係はありません。 –

+1

動的に割り当てられるメモリの量を変更することができます。 – ForceBru

+3

ここではクリーンアップの概念がたくさんあります。私はあなたをチェックアウトすることをお勧めします[最終的なC++ブックガイドとリスト](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) – WhiZTiM

答えて

1

は、ユーザーの種類数a

int a,*b; 
cin >> a; 
b= (int *)malloc(a*sizeof(int)); 

を検討してa int型を取得します。数字aは、ここではプログラマまたはコンパイラには知られていません。

コメントで指摘されているように、これはC++でまだ悪いスタイルですが、可能であればstd::vectorを使用してください。 newでも、まだmallocより優れています。しかし、(悪い)例が、動的メモリ割り当ての背後にある基本的な考え方を明確にするのに役立ちます。

+3

Cスタイルのキャスト用のEww。 –

+2

ええ、質問にはC++のタグが付いているので、ベクターなどを使用する必要があります.... – Anedar

+3

最近のC++では 'newall'をプログラム全体に散りばめていますが、' malloc'については話しません。 – WhiZTiM

0
int a[10]; 

、ローカルスコープ内であれば上記のコード行は、自動保存期間の10 int「sの配列を割り当てます。

int *a,*b,*c,*d; 

上、しかし、それはローカルスコープ内であった場合も同様に、また、自動ストレージ期間のintに4つのポインタを割り当てます。

a= (int *)malloc(sizeof(int)); 
b= (int *)malloc(sizeof(int)); 
c= (int *)malloc(sizeof(int)); 
d= (int *)malloc(sizeof(int)); 

最後に、上記の方法では、ポインタごとに変数intを動的に割り当てます。したがって、上記のすべてのポインタは、単一のint変数を指しています。

静的メモリ割り当てとは異なり、動的に割り当てられたメモリは、実行時に解放およびサイズ変更できます。自動保存期間のメモリは、スコープを使い果たしたときに解放されますが、サイズ変更することはできません。

+0

"ローカル関数" ? –

-1

Cでプログラムする場合は、結果をキャストする場合はmallocは不要です。 私はこれを読むことをお勧めします:Do I cast the result of malloc?

あなたのコードで4つのポインタで何をする必要はありません。実際にはあなただけの1 mallocで4 intの配列を割り当てることができます。

int *a; 
a = malloc(4 * sizeof(int)); 
0

あなたはそれがすべてのメモリだけだということですね。しかし、使い方に違いがあります。

一般的に、必要なメモリ量とそのメモリを安全に解放できる時間を事前に知る必要はありません。 mallocとその友人は、この方法で使用されるメモリを追跡できるように書かれています。

しかし、多くの特殊なケースでは、必要なメモリ量と必要な時間を事前に知ることがあります。たとえば、単純なループを実行するときにループカウンタとして機能するためには1つの整数が必要であることがわかっています。ループの実行が完了すると、ループカウンタを使用して処理が完了します。 mallocとその友人はここでもあなたのために働くことができますが、ローカル変数は簡単で、エラーが発生しにくく、より効率的です。

関連する問題