• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:複数のアドレスを関数から取得したいのですが)

関数から複数のアドレスを取得する方法

このQ&Aのポイント
  • 関数から複数のアドレスを取得する方法について教えてください。
  • 要件としては、関数から複数のアドレスを取得したいということです。
  • 具体的なイメージとしては、main関数のtest1とtest2にTest関数のdata1とdata2のアドレスが入るようにしたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • suzukikun
  • ベストアンサー率28% (372/1325)
回答No.1

data1とdata2はTestの中のローカル変数なのでTestが終了するとアドレスは不定になると思います。(ヒープ上にとっていると思うので) それでもかまわないのであれば&in_test1のところを&data1のように書き換えれば渡せるとは思います。 コンパイラによってはWarningが出るかなとも思います。

takuya245
質問者

お礼

すみません。ご指摘どおり例文自体が打ち間違えました。 void main(){   int *test1,*test2;   Test(test1,test2); } void Test(int *in_test1, int *in_test2){   int data1,data2;   data1 = 1;   data2 = 2;   in_test1 = &data1;   in_test2 = &data2; } 本当はクラスでこのようなことをやってはいるのですが、あくまでこれはin_test1とin_test2にアドレスが入り、元のtest1とtest2にはアドレスが入ってこないみたいなのです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

ローカル変数(data1,data)はスタック上に存在するので、呼び元の関数にアドレスを持ち帰ることは出来ません。正確には持ち帰ることは出来ますが、そのアドレスから参照できる値は保障されませんし、書き換えた場合はプログラムの動作が保障されません。 呼び元で変数を用意するか、mallocで確保したヒープ領域のアドレスを持ち帰る方法を検討してください。 なお、mallocした場合は不要になった時点でかならずfreeしてください。

takuya245
質問者

お礼

ご回答ありがとうございます。 例が悪いので質問をやり直させてください。 申し訳ありません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 続・複数のアドレスを関数から取得したいのですが

    suzukikun様 zwi様 早速のご回答ありがとうございました。 あまりにもお粗末な質問の仕方だった為前の質問は無かったことにして下さい。 申し訳ございません。 改めて質問させていただきます。 クラスから複数のアドレスを取得したいのですが方法がわかりません。 自際に試した簡略した内容が下記の通りです。 class CTest { private:   int data1,data2; public:   CTest();   Syutoku(int *in_test1,int *in_test2); }; CTest::CTest(){   data1 = 1;   data2 = 2; } CTest::Syutoku(int *in_test1,int *in_test2){   in_test1 = &data1;   in_test2 = &data2; } void main() {   int *test1,*test2;    CTest data;   //クラス内のdata1,data2のアドレスをtest1とtest2に入れたい   data.Syutoku(test1,test2); } これだとtest1とtest2にはアドレスが入ってこず、あくまでin_test1とin_test2にアドレスが入るだけです。 グローバル変数、又は構造体を使った戻り値を除いた方法で複数のアドレスの取得方法をご教授願います。

  • void関数について

     void ranmotion(...,&esti,...);  というvoid関数を作りまして、 int main() {  int esti=0; .... ranmotion(...,esti,...); } を計算したとき、ranmotion(...,esti,...)の中ではesti=100とかと計算が出来ているのですが、main関数の中では、esti=0のままになってしまいます。どうすればesti=100などの計算結果をmain関数内に持っていくことができるのでしょうか?  ご教授お願いします。

  • 関数先にて配列の長さを取得する方法

    関数にて、引数にて渡された配列(ポインタ)から配列数を調べる方法はないでしょうか? #include <stdio.h> void test(unsigned int *p){ printf ("%d\n", sizeof(*p)/sizeof(p[0])); //結果 1 } int main(){ unsigned int hoge[] = {0x30, 0x31,0x32}; test(hoge); printf("%d", sizeof(hoge)/sizeof(hoge[0])); //結果3 return 1; } 上記コードの関数testの*pから配列の数3が抜き取りたいと思っております。 よろしくお願いします。

  • 関数とポインタについて

    #include <stdio.h> void test(int *p); int main() { int i; test(&i); printf("%d",i); return 0; } void test( int *p) { static int k; k = 10; p = &k; } このようなプログラムを作って、void test()のkの値をmain関数で受け取りたいのですが、どのようにすればよいのかわかりません。 どなたか教えていただけませんか?

  • 関数の引数表記なしについて

    はじめまして。C言語初心者です。 質問させてください。 関数を宣言して引数を表記しないで使用することは可能なのでしょうか? またどのような場合に使用するのでしょうか? 例として以下コードになります。 ----------------------- #include<stdio.h> int test1(int a); void test2(int b); void main(){ int i = 0; int j = 0;       //この部分 i = test1; printf("%d\n", i);        //この部分 j = test2; printf("%p\n", j); } int test1(int a){ return a + 1; } void test2(int b){ printf("test"); } --------------------------- 出力結果を見ると関数のアドレスが帰ってくるように思われますが、詳細が分かりません。 詳しい方がいらしましたら教えてください。 宜しくお願いいたします。

  • 関数で取得したポインタを削除したい

    関数で取得したポインタを削除したい 以下のような方法でMain関数からpData0の実体を削除しようとしています。 ですが、これだとMain()で宣言したpdataが削除されるだけで、pData0のデータは残っています。 調べたところ、pdata = GetDataPointer(0)は、単なるポインタコピーに過ぎないからでしょうか。 このような場合は、どうしたらよいのでしょうか? よろしくお願いします。 void Main(void) {     CData *pdata;     pdata = GetDataPointer(0);     if (pdata) {         pdata->Remove();         pdata = NULL;     } } CData* GetDataPointer(int fg) {     CData *pRetData;          switch (fg) {     case 0:         pRetData = pData0;         break;     case 1:         pRetData = pData1;         break;     }          return pRetData; }

  • 構造体のアドレス渡し

    構造体をmain()からアドレス渡しで別関数(test.cpp)に渡し、その関数の中だけでの別関数test1()にその構造体を、値渡しでもアドレス渡しでも、渡せるのでしょうか? ちなみにmain.cppと、test.cppと、myhead.hとして分割コンパイルでやりました。 /*---------main.cpp--------*/ //ヘッダファイルで構造体宣言、test()のプロトタイプ宣言済み void main() { struct data dt[10]; ・・・・・・ test(dt); //test.cppのtest関数に構造体を渡す。 } /*---------test.cpp---------*/ void test1(??????); //test1()のプロトタイプ宣言 void test(struct data *p) //構造体をアドレス渡しで受け取った { ・・・・・ test1(?????); //test.cppで宣言したtest1関数に構造体を渡したい } どうかよろしくお願いします。

  • C 関数とポインタ

    ポインタと関数がよく分かりません。 (日本語がおかしくてすみません(^_^;)) たとえば↓のようなプログラムで、 #include <stdio.h> void increase(int *i); int main(void) { int x = 3; increase(&x); printf("%d\n", x); return 0; } void increase(int *i) { (*i)++; } 結果は4になりますが、increase(&x)が&xとなっていて、 関数はvoid increase(int *i)でint *iになっているのですが、 これはvoid increase(int *i)はint型の「ポインタ」なので、 increase(&x)も&xと「アドレス」を渡さなければいけないということですか?? そして、void increase(int *i)内では、アドレス&xの指す値をインクリメント、という考えで良いのでしょうか?

  • 関数ポインタにvirtual関数を与えたいです

    //関数ポインタについて質問させてください。 //error C2440: '=' : 'void (__thiscall A::* )(int,int)' から 'void (__cdecl *)(int,int)' に変換できません。 //というエラーが出ます。 //どうすればいいのか教えてください。 //よろしくお願いします。 #include<stdio.h> class A { public: void (*aaa)(int a,int b); virtual void test(int a,int b)=0; virtual void test2(int a,int b)=0; void execute() { aaa=test;//error C2440 } }; class B : public A { public: void test(int a,int b) { printf("test"); } void test2(int a,int b) { printf("test2"); } }; int main() { B b; b.execute(); b.aaa(2,3); return 0; }

  • bccでエラー:メンバー関数は呼び出すかそのアドレスを~

    クラスのメンバ関数を、ある関数(実は qsort)の引数として渡したい と思っています。環境は OS:Windows XP コンパイラ:C++Builder6 に付属の bcc32.exe です。 下記のコード(t.cpp)をコマンドプロンプトで bcc32 t としてコンパイルすると「※1」の行で下のエラーになります。 「エラー E2235 t.cpp 29: メンバー関数は呼び出すか  そのアドレスをとらなければならない(関数 main() )」 どのように直せば良いでしょうか? -------------------------------------------------------- #include <stdio.h> #include <stdlib.h> class Aclass { public: void f(int); }; void Aclass::f(int x) { printf("classfunc %d\n", x); } void sub1(int x) { printf("sub-1 %d\n", x); } void call_func(void(*func)(int), int x) { func(2*x + 1); } void main(void) { call_func((void(*)(int))sub1, 11); Aclass *a = new Aclass; call_func((void(*)(int))a->f, -7); //※1 delete a; } -------------------------------------------------------- この掲示板、行頭の空白が削除されてしまいますねー。

このQ&Aのポイント
  • インクカートリッジが検知できず、印刷ができないトラブルが発生しています。Windows10を使用し、無線LANで接続している環境です。ひかり回線を使用しています。このトラブルの解決方法についてまとめました。
  • ブラザー製品DCP-J572Nでの印刷トラブルの解決方法をお探しの方へ。インクカートリッジが検知できず、印刷ができない問題が発生しています。この記事では、Windows10を使用して無線LANで接続している環境での対処法を紹介します。
  • ブラザー製品DCP-J572Nの印刷トラブルでお困りの方へ。インクカートリッジが検知できず、印刷ができない問題が発生しています。Windows10で使用し、無線LANで接続している環境です。ひかり回線を使用している場合の解決方法についてご紹介します。
回答を見る