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