以下のようなプログラムを作りました。
make_mem関数のなかで構造体のメモリを確保し、
データを代入しています。
しかし、mainに返ってくると値が代入されていません。
よく調べてみると、mainで宣言してあるdataのアドレスが
変更されていません。
どのようにすれば、meake_memoのなかでメモリ確保し、
データを代入できるのでしょうか?
教えてください。
実際の使用しているプログラムはmake_memoのなかで
DBを開き、そのデータを配列に代入しているので、
main関数の中では配列の大きさがわかりません。
#include <stdio.h>
typedef struct {
inta;
intb;
}DATA;
int make_mem(DATA *data){
int i;
data=(DATA *)calloc(10,sizeof(DATA));
printf("calloc %p\n",data);
for (i=0;i<10;i++){
data[i].a = i;
printf("data[%d].a = %d\n",i,data[i].a);
}
return 0;
}
int main(int argc,char *argv[]){
DATA *data;
inti;
printf("before %p\n",data);
make_mem(data);
printf("after %p\n",data);
for (i=0;i<10;i++){
printf("data[%d].a = %d\n",i,data[i].a);
}
return 0;
}
No.4ベストアンサー
- 回答日時:
> freeで開放していないからってことですか?
> この場合はmainのなかでfreeをつかうってことですかね?
この場合は、そうなるとおもいます。
メインの最初でdataをNULLなどで初期化しておいて
メインを終了する前にdataがNULLでなければ
freeするという感じではないでしょうか。
わかりました。
ありがとうございました。
回答してくださった方まとめてのお礼で
申し訳ありませんが、ダブルポインタを
使用する事は目からウロコでした。
ありがとうございました。
No.3
- 回答日時:
みなさんがヒントを出されて、
理解されたようですのでそろそろ正解を。
ただし、このまま動かすとメモリリークしますよ。
#include <stdio.h>
typedef struct{
int a;
int b;
}DATA;
int make_mem(DATA **data){
int i;
*data=(DATA *)calloc(10,sizeof(DATA));
printf("calloc %p\n",*data);
for (i=0;i<10;i++){
(*data)[i].a = i;
printf("data[%d].a = %d\n",i,(*data)[i].a);
}
return 0;
}
int main(int argc,char *argv[]){
DATA *data;
int i;
printf("before %p\n",data);
make_mem(&data);
printf("after %p\n",data);
for (i=0;i<10;i++){
printf("data[%d].a = %d\n",i,data[i].a);
}
return 0;
}
回答ありがとうございました。
(*data)[i].a = i;
↑の書き方がわからず、悩んでいました。
>ただし、このまま動かすとメモリリークしますよ。
freeで開放していないからってことですか?
この場合はmainのなかでfreeをつかうってことですかね?
No.2
- 回答日時:
まずは簡単なクイズです。
次の結果は?#include <stdio.h>
void f(int a)
{
a=1;
}
int main(int argc,char** argv)
{
int a=0;
f(a);
printf("%d\n",a);
return 0;
}
答は「0が表示される」です。Cの関数はパラメータが値渡しされるため、パラメータを変更しても元の変数に影響しません。
この辺は理解されてますよね?
では本題。上のaの定義のintをDATA*に変えると?
…そう、パラメータとして受け取った値(この場合DATA *data)は値渡しされているため、関数内で変更しても元の変数に影響を与えません。つまり、ポインタ自体の値が元の関数に渡っていないのです。
解決法は、「ポインタを渡す」です。もうポインタで渡しているよと言われるかもしれませんが、そのポインタのポインタを渡すように変更するのです。つまり、
int make_mem(DATA **data)
に変えるわけです。当然、make_memの内容もそれにあわせて書き換える必要があります。
>この辺は理解されてますよね?
はい。理解しているつもりです
make_memo(DATA *data)になっているのでアドレス渡しに
なっていると思っていました。
>当然、make_memの内容もそれにあわせて書き換える必要があります。
このへんが、よくわからないのですが
調べてみます。
ありがとうございました。
No.1
- 回答日時:
DATA *dataを、int dataに置き換えると分かると思います。
関数内部でdataの値を変えても、外に出たときは変わっていませんよね。値渡しといって関数内部で変更しても反映されません。反映させるにはint *dataにしてアドレス渡しにしなければならないのです。これと同じ要領で、DATA **dataとすればよいです。
…と簡単な説明ですが、参考になれば。
make_memo(DATA *data)になっているのでアドレス渡しに
なっていると思っていました。
ダブルポインタにするってことですね。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- その他(プログラミング・Web制作) pythonでDBのカラム名で取得したオブジェクトの値を表示したい 1 2022/05/13 03:41
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- C言語・C++・C# 現在プログラムを作っているのですが、実行したときに写真のように結果が表示されるのですが、これを CH 2 2023/01/18 16:22
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# プログラミングの問題です。写真のプログラムの1から10を下のように入力しましたがプログラムが上手くい 3 2022/07/01 23:31
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
Excel VBA グラフ作成のとき...
-
stable diffusionのエラー
-
構造体のソートの方法について...
-
C言語について
-
EOM間にperl文を作成したい
-
ソートアルゴリズムについて質...
-
GETメソッドとPOSTメソ...
-
CGIを勉強しています。¥n(改...
-
CD R の書き込み
-
このプログラムはどういった事...
-
“半角カタカナ”は、ずいぶん昔...
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
ビットスワップとバイトスワッ...
-
COBOLのCOMP形式について
-
htmlソース編集で、各タグを何...
-
異なるドメインのサイトでcooki...
-
DataGridViewの特定列に入力さ...
-
pythonにCでのexternはありますか
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
【Excel VBA】10進数を2進数に...
-
int型(2バイト)データの分割
-
pythonでDBのカラム名で取得し...
-
エクセルVBA:日付データの変換...
-
C#でのswitch文
-
c言語での wavファイルの編集(...
-
C言語の構造体にてバブルソート...
-
linuxのシェルでファイル名に先...
-
'dataType' 引数を Null にする...
-
オセロゲーム 2次元配列で困...
-
H8/36064を使ったシリアル通信...
-
10個の実数に対する降順ソート...
-
c言語の多次元配列で1から100ま...
-
c言語 配列から数字だけをint型...
-
matlabのソースコードをpython...
-
Cのプログラムがどうしても動き...
-
テキストファイルの結合について
おすすめ情報