2010-12-02 18 views
0

皆さん!私は初心者のプログラマーであり、ポインタに関する助けが必要です。これは私がやろうとしていることです:私は関数(呼び出し元)へのポインタ引数arg1とarg2を2つ持っています。今私は、funcが呼び出された場所からの呼び出し元に変更が反映されるように、他の関数、たとえばfunc内でこれらのポインタを操作したいと思います。しかし、今私が関数内で行う変更は、呼び出し関数で取り消されます。ここにソースコードがあります:Cでのポインタ操作

func(node* arg1, node* argv2) 
{ 
    node* point3 = (struct node*) malloc(struct node); 
    arg2 = arg1; 
    arg 1 = point3; 
} 

caller(node* argv1, node* argv2) 
{ 
    func(arg1, arg2); 
} 

ここで、私はこれは参照手法によるパスを使用して行うことができることを知っています。しかし、そのfuncはfunc(node** arg, node** arg2)になり、私はダブルポインタにしたくないです。私は、プログラム内のすべての関数の関数が変更または変更されたときに配列がどのように変化するかについて、より多くのことを考えていました。私を助けてください !

+2

ちょうど参考にしてください:厳密なCでは、本当に 'malloc'の結果をキャストしてはいけません。また、型の代わりに 'sizeof(struct node)'を渡すべきです。私はこれが正直にコンパイルされても驚いています。 –

+0

あなたは正しいです。元のコードではsizeofを使用しました。ここにそれを書くのを忘れてしまった。 – Fahad

答えて

1


1)スワップポインタがこのためにあなたは二重のポインタ(**

を使用する必要があり、

func(node** arg1, node** arg2) 
{ 
    node* tmp = *arg2; 
    *arg2 = *arg1; 
    *arg1 = tmp; 
} 

2)スワップ内容、私はあなたがこのようにそれを行うことができると思います:


func(node* arg1, node* arg2) 
{ 
    node* tmp = (struct node*) malloc(sizeof(struct node)); 
    node* clean = tmp; 
    *tmp = *arg2; 
    *arg2 = *arg1; 
    *arg1 = *tmp; 
    free(clean); 
} 

メソッド1は、struct全体の代わりにポインタを交換するので、より効率的です。そして、言及した人のように、あなたはsizeof()をmallocの中で使うべきです。

+0

-1メモリをリークし、混乱する恐れがあるケース2の場合 –

+0

True、メモリがリークしていました。私は今それを修正した。 – Caner

+0

ローカルに必要なだけの場合でも、ヒープに割り当てる必要はありません。 –

0

ポインタ自体を変更する場合は、ポインタにポインタを渡す必要があります。 したがってfunc(node** arg1, node** arg2)が正しいです。それを行うには2つの方法があります

0

ダブルポインタを使用するのが実際には正しい方法です。しかし、混乱しているとわかった場合は、代わりに2つのポインタの配列を関数に渡すことができます。その後、配列の内容はリターン時に変更されます。

0

他の人は、この回避するための可能性があり、それがCで行うの方法です。この場合、ポインタへのポインタを使用して、言ったように:

#define func(arg1, argv2) do { node * point3 = malloc(); /* etc ... */ } while(0) 

....使用マクロはしかし、あなたのコードはつもりではありませんそれをすることでより美しくなります。 Cの暗い側に誘惑されないでください。