2016-09-19 2 views
1

У меня-структура 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); 

компилятор ничего не жалуюсь, но когда запускаю мой код, я получаю «Bad доступа» на последней строке кода функции get_data(...), как же?

+0

Как вы называете эту функцию? Узнайте, как создать [Минимальный, ** Полный ** и Подтверждаемый пример] (http://stackoverflow.com/help/mcve). –

+0

Когда вы вызываете 'get_data', где находится переменная' data' point? Вы * сделаете * заставляете его указывать где-то действительным до того, как вы назовете 'get_data'? Как вызов 'malloc' и назначение возвращаемого указателя на' data'? Или вы должны называть 'malloc' для структуры' MY_DATA' в функции 'get_data'? Наконец, 'get_data' или' getData'? –

+0

Кроме того, и немного подбирать, технически C не имеет доступа к ссылке. Его можно эмулировать *. :) –

ответ

3

Поскольку вы передаете адрес неинициализированного указателя, вы должны выделить s СТРУКТУРА 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; // <-- you haven't initialized the pointer 
get_data(&data); 

Вы можете исправить это:

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

@chqrlie Я упомянул, что «указатель на MY_DATA будет достаточным», поэтому 'm_data' является указателем на' MY_DATA' – artm

+0

ОК, но ваше предложение реализует другую семантику. возвращение указателя было бы лучшей альтернативой. – chqrlie

+0

Функция get_data() от третьей стороны, я не могу ее изменить. Было бы неплохо иметь решение без изменения сигнатуры функции get_data (...). –

0

пройти мимо reference означает, что вы передаете значение через ссылку другой переменной, а pass by value означает, что вы передаете значение либо string, float, character или boolean.

 Смежные вопросы

  • Нет связанных вопросов^_^