2016-09-19 17 views
1

のポインタのポインタに値を割り当てる:パス&構造体

struct MY_TYPE { 
    boolean flag; 
    short int xyz; 
}; 

Iは、上記構造体へのポインタの種類とフィールドを持つ別の構造体MY_DATAを有します

struct MY_DATA { 
    MY_TYPE *m_type; 
    double value; 
}; 

私は、パラメータとしてMY_DATAのポインタにのポインタをとる関数を持っています私はによって機能上記の呼び出し

:コンパイラは何も文句はありませんが、私のコードを実行したとき、私は機能get_data(...)のコードの最後の行に「不正アクセス」を取得するには、どのように来る

struct MY_DATA *data; 
get_data(&data); 

+0

どのように関数を呼び出しますか? [最小、**完全**、および検証可能な例](http://stackoverflow.com/help/mcve)の作成方法を学んでください。 –

+0

'get_data'を呼び出すと、変数' data'はどこにありますか? 'get_data'を呼び出す前にどこか有効であると指摘していますか? 'malloc'を呼び出し、返されたポインタを' data'に割り当てるのと同じですか?あるいは、 'get_data'関数の' MY_DATA'構造体のために 'malloc'を呼び出すことになっていますか?最後に、 'get_data'または' getData'ですか? –

+0

また、ちょっとニットするには、技術的にはCが参考になっていません。それは*エミュレートすることしかできません。 :) –

答えて

3

struct MY_DATA *data; // <-- you haven't initialized the pointer 
get_data(&data); 

次の方法でこれを修正することができます初期化されていないポインタのアドレスは、s tructure MY_DATA同様:

void getData(struct MY_DATA **m_data) { 
    // create a MY_TYPE pointer & assign value to its field 
    struct MY_TYPE *m_type_tmp = malloc(sizeof(struct MY_TYPE)); 
    m_type_tmp->flag = 0; 
    m_type_tmp->xyz = 123; 

    // allocate the MY_DATA structure: 
    *m_data = malloc(sizeof(*m_data)); 
    // Initialize all members 
    (*m_data)->m_type = m_type_tmp; 
    (*m_data)->value = 0; 
} 

機能が割り当てられた構造体へのポインタを返すように単純に次のようになります。

struct MY_DATA *getData(void) { 
    // create a MY_TYPE pointer & assign value to its field 
    struct MY_TYPE *m_type_tmp = malloc(sizeof(*m_type_tmp)); 
    m_type_tmp->flag = 0; 
    m_type_tmp->xyz = 123; 

    // allocate the MY_DATA structure: 
    struct MY_DATA *m_data = malloc(sizeof(*m_data)); 
    // Initialize all members 
    m_data->m_type = m_type_tmp; 
    m_data->value = 0; 
    return m_data; 
} 

そして、このようにそれを呼び出す:

struct MY_DATA *data = get_data(); 
+0

あなたの答えはすぐに私の問題の原因を指摘する、はい、私はそれが初期化されていないので、MY_DATAのヒープを割り当てる必要があります。ありがとう! –

1

のgetData(構造体MY_DATA ** M_DATA)

あなたはMY_DATAへのポインタで十分だろう、MY_DATAへのポインタへのポインタを必要としません。

その後の代わりに、あなたが書くことができ(** m_data).m_type = m_type_tmp;

m_data->m_type = m_type_tmp;

また、これらが間違っている:あなたが渡すので

struct MY_DATA data = {0}; 
get_data(&data); 
+0

@chqrlie私は "MY_DATAへのポインタは十分である"と言ったので、 'm_data'は' MY_DATA'へのポインタです。 – artm

+0

OKですが、あなたの命題は異なるセマンティクスを実装しています。ポインタを返す方が良い方法です。 – chqrlie

+0

get_data()関数はサードパーティ製のため、変更することはできません。 get_data(...)関数のシグネチャを変更せずに解決策を用意することは良いことです。 –

0

パスで参照は、他の変数の参照を介して値を渡していることを意味します。値渡しとは、string、float、characterまたはbooleanのいずれかの値を渡すことを意味します。