Невнятная ошибка при обращении к памяти - 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
- это указатель на выделенную память.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д