2017-04-01 14 views
0

今日、私はC言語で最も近い点のペアを見つけるというラボの割り当てに取り組んでいました。 構造体の配列をどのように機能させるのかよく知っていますが、何らかの理由で配列がmain()関数の変更を反映していません。 私のコードはかなり面倒だったので、私はフォールトを理解するために小さなコードを作成しました。続き はコードです:パラメータとして渡された構造体の配列が変更を反映していません

#include <stdio.h> 
#include <stdlib.h> 

struct node { 
    int x; 
    int y; 
}; 

void fun(struct node *); 

int main() 
{ 
    struct node *arr = (struct node *)malloc(2 * sizeof(struct node)); 
    arr[0].x = 1; 
    arr[0].y = 2; 
    printf("%d %d\n", arr[0].x, arr[0].y); 
    fun(arr); 
    printf("%d %d\n", arr[0].x, arr[0].y); 

    return 0; 
} 

struct node *fun2() 
{ 
    struct node *tmp = (struct node *)malloc(2 * sizeof(struct node)); 
    tmp[0].x = 3; 
    tmp[0].y = 4; 

    return tmp; 
} 

void fun(struct node *arr) 
{ 
    arr = fun2(); 
} 

出力

1 2 
1 2 

が、次のコードはARR配列が変化

#include <stdio.h> 
#include <stdlib.h> 

struct node { 
    int x; 
    int y; 
}; 

void fun(struct node *); 

int main() 
{ 
    struct node *arr = (struct node *)malloc(2 * sizeof(struct node)); 
    arr[0].x = 1; 
    arr[0].y = 2; 
    printf("%d %d\n", arr[0].x, arr[0].y); 
    fun(arr); 
    printf("%d %d\n", arr[0].x, arr[0].y); 

    return 0; 
} 

struct node *fun2() 
{ 
    struct node *tmp = (struct node *)malloc(2 * sizeof(struct node)); 
    tmp[0].x = 3; 
    tmp[0].y = 4; 

    return tmp; 
} 

void fun(struct node *arr) 
{ 
// arr = fun2(); 
    arr[0].x = 3; 
    arr[0].y = 4; 
} 

出力

1 2 
3 4 

でした誰もが時間を反映しているため私と一緒にエルプ?

答えて

0

最初のバージョンでは、は、arrに割り当てられています。arrmainに変更されません。 2番目のステップでは、arrが指しているものを変更します:変更したい構造。

+0

私はそれを理解しました。 main()とfun()のarrはバージョン2の同じメモリ位置を指しているので、fun()のバージョン1のarrがそのポイントメモリの場所を別の場所に変更している間は変更されません。それは私の愚かだった。お返事をありがとうございます。 – user74571

関連する問題