C++でアプリケーションを作っています。
メモリ領域を動的に確保するコードを書いているところなのですが、
int *pr; // ポインタ
kakuho(pr,100); // 新たにメモリ領域int100個分確保し、先頭番地をprに返す関数
というコードを作りたいのですが、
kakuho(int *pr,int num){
pr=new int[num];
return;
}
このようなプログラムを書いてVisual C++.NETでコンパイルすると、コンパイルは成功するのですが、実行時に
Run-Time Check Failure #3 - The variable 'pr' is being used without being defined.
このメッセージの意図することがよくつかめぬまま、ここで開発が止まっています。
どういう意味なのか、また、解決するにはどのようにしたらよいか教えてください。
No.7
- 回答日時:
void kakuho(int **p,int num)
{
*p=new int[num];
*(p+0)=1; // 先頭の領域に1を格納したつもり
*(p+1)=2; // 2番目の領域に2を確保したつもり
}
上記プログラムはメモリを破壊します。
引数pは「intのポインタへのポインタ」ですから
*p=new int[num];
(*p)[0]=1;
(*p)[1]=2;
と書く必要があります。
判りやすく書き直すと
void kakuho(int **array_ptr,int num)
{
int *array; // 配列の先頭を保持する一時変数
array = new int[num]; // 配列を確保
*array_ptr = array; // 確保アドレスを呼出元に返す
array[0]=1; // 先頭の領域に1を格納
//(*array_ptr)[0]=1;でも同じ
array[1]=2; // 2番目の領域に2を格納
//(*array_ptr)[1]=2;でも同じ
}
となります。
No.6
- 回答日時:
あぁ答え書いてる間に回答出てたわ。
。。orzじゃあ1つだけ。
mallocは使ってはいかんのですか?
ANSIレベルで定義されているし、簡単だと思うのですが・・・
No.5ベストアンサー
- 回答日時:
「変数 'pr' が定義される前に参照されている」と言うエラーです。
kakuho(int *pr,int num){
pr=new int[num];
return;
}
このように書いた場合、prはグローバル変数ではなく、関数に渡された引数prを初期化しています。そして、引数prは関数を抜けた瞬間に消えて無くなります(つまり、初期化したのが「無かった事」にされる)
「C、C++では、引数は実体渡しされない。一時的な変数が作成され、値が一時変数にコピーされてから関数が呼ばれ、関数から抜けると同時に、引数は自動的に破棄される」と言うのを覚えておいて下さい。
関数内で何かの変数を初期化する(変数に値を設定して来て欲しい)場合は、変数のアドレスを渡す必要があります(変数の実体にアクセスする為の手掛りを渡す)
呼び出し側の
int *pr;
kakuho(pr,100);
では、アドレスが未定義のままのprを引数に渡そうとしているので「変数 'pr' が定義される前に参照されている」と言う事になります。
「引数に渡す=参照」です。「引数に渡す」とは「一時変数を作成して、その一時変数に値をコピーする」と言う事なので、値をコピーしようとして「参照」を行う事になります。
以下のように書き替えて下さい。
int *kakuho(int num);
main() {
int *pr;
pr = kakuho(100);
return 0;
}
int *kakuho(int num) {
return new int[num];
}
以下のような記述でもOKですが、関数からの戻り値を使わない分、無駄が増えます。(こちらの方が、質問者さんが書いたソースコードに近い)
void kakuho(int **p,int num);
main() {
int *pr;
kakuho(&pr,100);
return 0;
}
void kakuho(int **p,int num) {
*p = new int[num];
}
回答ありがとうございました。サンプル通りにやるとうまくできました。
ところで、kakuho()の中で確保した領域に値を代入するにはどうすればよいのでしょうか?
void kakuho(int **p,int num)
{
*p=new int[num];
*(p+0)=1; // 先頭の領域に1を格納したつもり
*(p+1)=2; // 2番目の領域に2を確保したつもり
}
とすると
int *u;
kakuho(u,20); // 20個分確保
cout << u[0] << endl;
cout << u[1] << endl;
とすると、
1
4301832
と、1番目はうまくいっていますがそれ以降がうまくいっていません。
どうすればよいのでしょうか(皆さんの回答を理解しきっていないということになってしまいますが…)
No.4
- 回答日時:
変数varの内容を変更する関数であれば、引数に渡すものは変数varへのポインタか変数varの参照である必要があります。
関数kakuhoの中で変数prに何らかの値を設定する、つまり変数prの内容を変更したいのですよね。
> kakuho(pr,100);
という文は関数kakuhoに「変数prの値」を渡しいます。これでは変数prの内容は変わりません。
No.3
- 回答日時:
ポインターに確保したメモリのアドレスをセットする為には、以下のようにします。
int *pr; // ポインタ
kakuho(pr,100); を
kakuho(&pr,100); // pr->&pr
kakuho(int *pr,int num){
pr=new int[num];
return;
}
を
kakuho(int **pr,int num){ //*pr -->**pr
*pr=new int[num]; //pr --> *pr
return;
}
上記のように変更して下さい。
No.2
- 回答日時:
/* target を 0 に設定する */
void set0(int target) { target = 0; }
int x = 3;
set0(x);
これでxは0になるでしょうか? なりませんよね。
void set0(int* target) { *target = 0; }
int x = 3;
set0(&x);
これならOK. ポインタについても同様です。
# '*'がひとつ足りないのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
比較回数と交換回数表示について
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
std::set<int> で、ある値が何...
-
C言語で三目並べをするプログラ...
-
商と剰余を同時に求める(C言語)
-
if と配列の組み合わせ
-
【C++】関数ポインタの使い方
-
並列プログラミングのπ計算につ...
-
c言語
-
HANDLEて何ですか?
-
read関数をノンブロッキングで...
-
卒業研究でよく分からないとこ...
-
DLLをGetProcAddress()で実行で...
-
GlobalAllocの変数を関数に引き...
-
シグマ公式・・・C言語
-
ファイルから読みこむ方法
-
c言語の問題です
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
「指定されたキャストは有効で...
-
C言語 配列と関数の練習問題
-
複数桁10進数の*桁目だけを抽出...
-
(int *)の意味
-
if と配列の組み合わせ
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
c言語
-
足して100になるような乱数のア...
-
C言語初心者です、、、お助けく...
-
数字列を3桁ごとにカンマで区切...
-
C言語 エラーの原因がわからな...
-
実数の整数部,小数部の取得
-
課題でつまってます・・・
-
商と剰余を同時に求める(C言語)
-
C言語の配列をC++のvectorに高...
-
std::set<int> で、ある値が何...
おすすめ情報