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

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

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

Здравствуйте. Вкратце: библиотека наружу выдает структуру entity_t, которая содержит указатель на различные типы объектов, их идентификаторы и деструктор, также выдаем всякие сервисные функции и конструкторы. Собственно клиент ничего кроме этого entity и разных сеттеров геттеров ничего не должен знать. Понятно, что все объекты ссылочные. Программа работает непредсказуемо, иногда все исполняется, иногда глухо виснет. Сократил код, собственно до локализации ошибки, но я не могу ее найти. Уже assert'ов всюду понапихал от отчаянья. Помогите найти ошибку пожалуйста:
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. //================================ entity
  5. typedef struct {
  6. void* obj;
  7. int Tid;
  8. void (*destroy)(void* obj)
  9. }* entity_t;
  10.  
  11. void delEntity(entity_t E){
  12. E->destroy(E->obj);
  13. E->obj = NULL;
  14. free(E);
  15. E=NULL;
  16. }
  17.  
  18. entity_t newEntity(int id){
  19. entity_t E;
  20. E = (entity_t)malloc(sizeof (entity_t));
  21. E->Tid = id;
  22. return E;
  23. }
  24. //================================ object
  25. const objectID = 3;
  26. typedef struct{
  27. int someField;
  28. }* object_t;
  29.  
  30. void delObject(void* obj){
  31. ((object_t)obj)->someField = 0;
  32. free(obj);
  33. obj = NULL;
  34. }
  35.  
  36. entity_t newObject(){
  37. entity_t E = newEntity(objectID);
  38. assert(E);
  39. E->obj = malloc(sizeof (object_t));
  40. assert(E->obj);
  41. ((object_t)E->obj)->someField = 111;
  42. E->destroy = delObject;
  43. return E;
  44. }
  45.  
  46. void setObjectValue(entity_t E,int value){
  47. object_t O;
  48. assert(E);
  49. if(E->Tid == objectID){
  50. assert(E->obj);
  51. ((object_t)(E->obj))->someField = value;
  52. }
  53. }
  54.  
  55. int getObjectValue(entity_t E){
  56. object_t O;
  57. int R;
  58. assert(E);
  59. if (E->Tid == objectID){
  60. assert(E->obj);
  61. R = ((object_t)(E->obj))->someField;
  62. }
  63. return R;
  64. }
  65. //================================ main
  66. int main()
  67. {
  68. int i;
  69. entity_t obj1 = newObject();
  70. setObjectValue(obj1,55);
  71. i = getObjectValue(obj1);
  72. printf ("%i\n",i);
  73. return 0;
  74. }

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

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

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

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

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


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

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

10   голосов , оценка 3.6 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы