動的メモリ確保で悩んでます。
ちなみに、ポインタの知識は少ないです。
下記に記したように、main上で動的メモリ確保はできたのですが、
<pre>
#include <stdio.h>
#include <stdlib.h>
int main(){
int i;
int *a;
int totala = 5;
a = (int*)malloc(totala * sizeof(int));
for(i=0; i<totala ;i++){
a=i;
}
for(i=0; i<totala ;i++){
printf("a[%d] = %d\n",i,a);
}
return 0;
}
</pre>
実行結果
a[0] = 0
a[1] = 1
a[2] = 2
a[3] = 3
a[4] = 4
一旦他の関数へいき、そこでメモリ確保をし、
main上で使用する事ができませんでした(下記)。
<pre>
#include <stdio.h>
#include <stdlib.h>
void Read(int *a, int *totala);
int main(){
int i;
int *a;
int totala = 0;
Read(a, &totala);
printf("totala %d in main\n",totala);
for(i=0; i<totala ;i++){
printf("a[%d] = %d in main\n",i,a);
}
return 0;
}
void Read(int *a, int *totala){
int i;
*totala = 5;
printf("totala %d in Read\n",*totala);
a = (int*)malloc(*totala * sizeof(int));
for(i=0; i<*totala ;i++){
a=i;
}
for(i=0; i<*totala ;i++){
printf("a[%d] = %d in Read\n",i,a);
}
};
</pre>
実行結果
totala = 5 in Read
a[0] = 0 in Read
a[1] = 1 in Read
a[2] = 2 in Read
a[3] = 3 in Read
a[4] = 4 in Read
totala = 5 in main
上記に記したように、グローバル変数を用いずに、
一旦他の関数へいき、そこでメモリ確保をし、
main上で使用するという事はできないのでしょうか?
また、こういうやり方は間違っているのでしょうか?
グローバル変数を使用したほうがいいのでしょうか?
書き方のアドバイスも宜しくお願います。
ご指導宜しくお願いします。
動的メモリ確保
Re:動的メモリ確保
サブ関数で領域確保する際はダブルポインタを使います。
malloc関数で返されたアドレスをmain関数に返すためです。
int と int* の違いと同じように考えてください。
>void Read(int *a, int *totala){
void Read(int **a, int *totala){
>a = (int*)malloc(*totala * sizeof(int));
*a = (int*)malloc(*totala * sizeof(int));
>a=i;
(*a)=i;
グローバル変数は膨大なソースで開発者が複数いる場合など
「いつ」「どこで」「だれが」値を変えるかわからないので、
使わなくて済むほうが良いです。
malloc関数で返されたアドレスをmain関数に返すためです。
int と int* の違いと同じように考えてください。
>void Read(int *a, int *totala){
void Read(int **a, int *totala){
>a = (int*)malloc(*totala * sizeof(int));
*a = (int*)malloc(*totala * sizeof(int));
>a=i;
(*a)=i;
グローバル変数は膨大なソースで開発者が複数いる場合など
「いつ」「どこで」「だれが」値を変えるかわからないので、
使わなくて済むほうが良いです。
Re:動的メモリ確保
> Read(a, &totala);
Read(&a, &totala);
> printf("a[%d] = %d in Read\n",i,a);
printf("(*a)[%d] = %d in Read\n",i,(*a));
main関数でreturn 0;する前にfree(a);
も追加修正すれば大丈夫でありましょう。
Read(&a, &totala);
> printf("a[%d] = %d in Read\n",i,a);
printf("(*a)[%d] = %d in Read\n",i,(*a));
main関数でreturn 0;する前にfree(a);
も追加修正すれば大丈夫でありましょう。
Re:動的メモリ確保
二人の回答を見て、書き直したところ見事に
解決しました。
少し、自分にはややこしいダブルポインタですが、
いい勉強になりました。
また、違う質問もありますので、
次も宜しくお願いします。
ぴよぴよさん、boxさんどうもありがとうございました。
解決しました。
少し、自分にはややこしいダブルポインタですが、
いい勉強になりました。
また、違う質問もありますので、
次も宜しくお願いします。
ぴよぴよさん、boxさんどうもありがとうございました。