Невнятная ошибка при обращении к памяти - 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);
Объяснение кода листинга программы
E- это переменная, которая получает результат работы функцииmalloc.- Значение
sizeof *E- это размер памяти, который нужно выделить для переменнойE. E- это указатель на выделенную память.