2016-04-05 20 views
0

私は動的ポインタをよりよく把握したいと思っています。動的ポインタ操作Cプログラミング

int main(){ 

    // allocate pointer 
    randomStructure *pt = (randomStructure *)malloc(sizeof(randomStructure)); 

    // arbitrary code that manipulates data that *pt points to. 

    // function call 
    function(pt); 

    return 0; 
} 


void function(randomStructure *pt){ 

    randomStructure *tempPt = (randomStructure *)malloc(sizeof(randomStructure)); 

    // arbitrary code that manipulates data that *tempPt points to. 

    pt = tempPt; 

    //free(tempPt); Question2 

    /* Question 4 
    while(index){ 
    randomStructure *tempPt = (randomStructure *)malloc(sizeof(randomStructure)); 

    } 
    */ 

} 

質問:私は関数に*ptを渡すと

  1. 、それは自動的にメインに*ptを更新しないか、私はそれを行うために関数から*ptを返すために必要なのですか?

  2. *tempPtの機能を無料にすると、無料の*ptが表示されますか?

  3. 私は関数内で*tempPtをmallocすれば、そのデータが指すデータは、関数が終了すると自動的に解放されますか?

  4. この質問は、前の質問から間接的に回答されるかもしれませんが、*tempPtを作成し、ループを解除して*ptの割り当てを解除してプロセスを繰り返すにはどうすればよいですか?

EDIT質問4:私がしようとしているより具体的な例は、おそらく質問を明確にするでしょう。私は基本的なヒューリスティックアルゴリズムを実行しています。ポインタを関数に渡した後、データを操作し、アルゴリズムを実行して* tempPtを指すようにします。 * tempPtのデータが* ptよりも最適化されている場合は、* ptを* tempPtのデータで更新したいと考えています。

+1

「ダイナミックポインタ」とは何ですか? –

+1

ようこそスタックオーバーフロー。弁護士や署名を使わないでください。 SOはディスカッション・リストではなく、プログラミング問題のオンライン・リファレンス・ブックです。簡潔さと明瞭さは非常に重要であり、逆に、毛羽は望ましくない。詳細は「[ask]」をお読みください。 –

+1

Gotcha my bad。それは私の最初の投稿です。すべてのアドバイスは大歓迎です!ダイナミックに割り当てられたメモリを指すポインタをどのように呼び出すのかが完全にはわからないので、単に「ダイナミックポインタ」と呼んでいます。おそらく、私のサンプルコードはそれにもっと光を当てるだろうか? – Snawwz

答えて

0
  1. あなたは(あなたが含まれる機能を持っているように)、それはメモリアドレスを更新しようとしないptポイントは、メイン関数内のポインタによって指されたメモリアドレスを変更した場合。ただし、そのメモリアドレスのデータを変更すると、メインファンクションのptもその変更されたデータを指します。
  2. はい、どちらも同じ基礎データを指しています。
  3. いいえ、Cには自動ガベージコレクションがないため、ヒープで宣言されたメモリは明示的に解放する必要があります。
  4. 私はあなたが何を求めているのか多少確信しています。 tempPtを解放した場合、ptは、表示されたコードの中でぶら下がっているポインタになる可能性があります。両方のコードが同じ基礎データを指しているからです。したがって、temptPt == ptの場合は、tempPtが指し示すデータを解放することもできません。ptが指すデータを解放することもなく、同じデータを指しているためです。
+0

ありがとうございます!質問4を更新して、私がやろうとしていることをもう少し明らかにしました。 – Snawwz

+0

'tempPt'と' pt'が同じデータを指していない場合、 'pt'が指すデータを解放し、関数から' tempPtr'を返すことができます。だから、あなたの関数呼び出しは 'pt = function(pt);' – user3147395

+0

ですね、私は同じことを考えていました!ほんとうにありがとう。乾杯 – Snawwz

関連する問題