動的メモリ確保

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
fumu

動的メモリ確保

#1

投稿記事 by fumu » 17年前

動的メモリ確保で悩んでます。
ちなみに、ポインタの知識は少ないです。

下記に記したように、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上で使用するという事はできないのでしょうか?

また、こういうやり方は間違っているのでしょうか?
グローバル変数を使用したほうがいいのでしょうか?
書き方のアドバイスも宜しくお願います。

ご指導宜しくお願いします。

Yuki

Re:動的メモリ確保

#2

投稿記事 by Yuki » 17年前

サブ関数で領域確保する際はダブルポインタを使います。
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;

グローバル変数は膨大なソースで開発者が複数いる場合など
「いつ」「どこで」「だれが」値を変えるかわからないので、
使わなくて済むほうが良いです。

box

Re:動的メモリ確保

#3

投稿記事 by box » 17年前

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

も追加修正すれば大丈夫でありましょう。

fumu

Re:動的メモリ確保

#4

投稿記事 by fumu » 17年前

二人の回答を見て、書き直したところ見事に
解決しました。

少し、自分にはややこしいダブルポインタですが、
いい勉強になりました。

また、違う質問もありますので、
次も宜しくお願いします。

ぴよぴよさん、boxさんどうもありがとうございました。

管理人

Re:動的メモリ確保

#5

投稿記事 by 管理人 » 17年前

fumuさん、全然回答とは関係ないんですが、
ぴよぴよ はポイントのランクであって、名前じゃなく、
boxさんと、Yukiさんです^^;

fumu

Re:動的メモリ確保

#6

投稿記事 by fumu » 17年前

すいません。
初めてこちらにきたので間違えてしまいました。

改めて、boxさん、Yukiさん
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る