簡體   English   中英

通過引用傳遞並將值賦給struct的指針

[英]pass by reference & assign value to a pointer of pointer of struct

我有一個結構MY_TYPE

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

我還有另一個結構MY_DATA ,它的字段類型指向上述結構:

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

我有一個函數,該函數將指向 MY_DATA 指針作為參數:

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 -> xyz = 123;

    // I try to assign a value to the MY_TYPE field of m_data,
    // there is no compiler error, but run time error "bad access"
    (** m_data).m_type = m_type_tmp;
}

我通過以下方式調用上述函數:

struct MY_DATA *data;
get_data(&data);

編譯器沒有任何抱怨,但是運行我的代碼時,我在函數get_data(...)的最后一行得到“錯誤訪問”,這是怎么回事?

由於傳遞了未初始化指針的地址,因此還必須分配結構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();

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;  // <-- you haven't initialized the pointer
get_data(&data);

您可以通過以下方法解決此問題:

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

按引用傳遞意味着您將值傳遞給其他變量的引用,而按值傳遞意味着將值傳遞給字符串,float,character或boolean。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM