создание ADT с использованием его функции - C

Итак, я пытаюсь написать функцию, которая возвращает указатель на ADT в куче.

Проблема в том, что я не могу манипулировать им после выделения памяти. Вот упрощенный код

typedef struct _entity {
    int value;
} *Entity;


Entity *new_entity() {
    Entity *ptr = (Entity*)malloc(sizeof(struct _entity));
    assert( ptr );

    (*ptr)->value = 5; // program crashes after this line

    return ptr;
}

Ошибка:

Необработанное исключение по адресу 0x013e1665 в test.exe: 0xC0000005: место записи нарушения прав доступа 0xcdcdce21.


person Kirill Kulakov    schedule 09.06.2012    source источник


Ответы (2)


typedef struct _entity {
    int value;
} *Entity;
  ^
  ^

Вы, вероятно, не хотите этого *. В противном случае вы определяете тип Entity как указатель на структуру, а не структуру. Таким образом, ваш код станет:

typedef struct _entity {
    int value;
} Entity;


Entity *new_entity(void) {
    Entity *ptr = malloc(sizeof(*ptr));
    assert( ptr );

    ptr->value = 5;

    return ptr;
}

Если по какой-то причине вы действительно хотите, чтобы Entity был типом указателя, то остальная часть вашего кода неверна. Вы выделили место для указателя, но не для того, на что он указывает. Это должно быть больше похоже на это:

Entity *ptr = malloc(sizeof(*ptr));  // Allocate an Entity
*ptr = malloc(sizeof(**ptr));        // Allocate a *Entity

Но в этом почти наверняка нет необходимости.

person Oliver Charlesworth    schedule 09.06.2012
comment
Это должен быть указатель, иначе он будет потерян, когда я верну указатель (застрявший кадр будет потерян) - person Kirill Kulakov; 09.06.2012
comment
@kirill: теперь у вас есть два уровня косвенности (т. е. указатель на указатель на структуру), тогда как вам, вероятно, нужен только один (т. е. указатель на структуру). - person Oliver Charlesworth; 09.06.2012
comment
хорошо, это работает, но я не могу понять, почему, не могли бы вы объяснить? - person Kirill Kulakov; 09.06.2012
comment
@kirill: Цель этой функции — создать новый экземпляр структуры, верно? Поэтому вам нужно динамически выделить один и вернуть его адрес. Но вам не нужно динамически выделять указатель. - person Oliver Charlesworth; 09.06.2012

вы не должны использовать оба * и ->, достаточно одного из них

ptr->value = 5 

OR

(*ptr).value = 5
person Diaa Sami    schedule 09.06.2012