Невнятная ошибка при обращении к памяти - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Вкратце: библиотека наружу выдает структуру entity_t, которая содержит указатель на различные типы объектов, их идентификаторы и деструктор, также выдаем всякие сервисные функции и конструкторы. Собственно клиент ничего кроме этого entity и разных сеттеров геттеров ничего не должен знать. Понятно, что все объекты ссылочные. Программа работает непредсказуемо, иногда все исполняется, иногда глухо виснет. Сократил код, собственно до локализации ошибки, но я не могу ее найти. Уже assert'ов всюду понапихал от отчаянья. Помогите найти ошибку пожалуйста:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
 
//================================ entity
 
typedef struct {
    void* obj;
    int Tid;
    void (*destroy)(void* obj)
}* entity_t;

void delEntity(entity_t E){
    E->destroy(E->obj);
    E->obj = NULL;
    free(E);
    E=NULL;
}

entity_t newEntity(int id){
    entity_t E;
    E = (entity_t)malloc(sizeof (entity_t));
    E->Tid = id;
    return E;
}
 
//================================ object
 
const objectID = 3;
typedef struct{
    int someField;
}* object_t;

void delObject(void* obj){
    ((object_t)obj)->someField = 0;
    free(obj);
    obj = NULL;
}

entity_t newObject(){
    entity_t E = newEntity(objectID);
    assert(E);
    E->obj = malloc(sizeof (object_t));
    assert(E->obj);
    ((object_t)E->obj)->someField = 111;
    E->destroy = delObject;
    return E;
}

void setObjectValue(entity_t E,int value){
    object_t O;
    assert(E);
    if(E->Tid == objectID){
        assert(E->obj);
        ((object_t)(E->obj))->someField = value;
    }
 
}

int getObjectValue(entity_t E){
    object_t O;
    int R;
    assert(E);
        if (E->Tid == objectID){
            assert(E->obj);
            R = ((object_t)(E->obj))->someField;
        }
    return R;
}
 
//================================ main
 
int main()
{
    int i;
    entity_t obj1 = newObject();
 
    setObjectValue(obj1,55);
    i = getObjectValue(obj1);
    printf ("%i\n",i);
 
    return 0;
}

Решение задачи: «Невнятная ошибка при обращении к памяти»

textual
Листинг программы
E = malloc(sizeof *E);

Объяснение кода листинга программы

  1. E - это переменная, которая получает результат работы функции malloc.
  2. Значение sizeof *E - это размер памяти, который нужно выделить для переменной E.
  3. E - это указатель на выделенную память.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.6 из 5
Похожие ответы