Ошибка Invalid pointer при использовании malloc и struct - C (СИ)

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

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

Здравствуйте. Написал программу для того, чтобы понять работу malloc.
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct
  4. {
  5. char* first_name;
  6. char* last_name;
  7. } Entry;
  8. int main(void)
  9. {
  10. Entry *e;
  11. e = malloc(1*sizeof(Entry));
  12. (*e).first_name=malloc(10*sizeof(char));
  13. (*e).first_name="Dmitry";
  14. (*e).last_name=malloc(10*sizeof(char));
  15. (*e).last_name="Sidorov";
  16. printf("%s %s\n", (*e).first_name, (*e).last_name);
  17. free((*e).first_name);
  18. free((*e).last_name);
  19. free(e);
  20. return EXIT_SUCCESS;
  21. }
При выполнении программы возникает ошибка:
Листинг программы
  1. ./test
  2. Dmitry Sidorov
  3. *** Error in `./test': munmap_chunk(): invalid pointer: 0x0000000000400714 ***
  4. ======= Backtrace: =========
  5. /lib/x86_64-linux-gnu/libc.so.6(+0x7f4c6)[0x7fd9aaff44c6]
  6. ./rodion[0x400643]
  7. /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7fd9aaf96de5]
  8. ./rodion[0x4004f9]
  9. ======= Memory map: ========
  10. 00400000-00401000 r-xp 00000000 08:01 2752626 /home/dmitry/Desktop/c/test
  11. 00600000-00601000 r--p 00000000 08:01 2752626 /home/dmitry/Desktop/c/test
  12. 00601000-00602000 rw-p 00001000 08:01 2752626 /home/dmitry/Desktop/c/test
  13. 014b9000-014da000 rw-p 00000000 00:00 0 [heap]
  14. 7fd9aad5f000-7fd9aad74000 r-xp 00000000 08:01 1577226 /lib/x86_64-linux-gnu/libgcc_s.so.1
  15. 7fd9aad74000-7fd9aaf73000 ---p 00015000 08:01 1577226 /lib/x86_64-linux-gnu/libgcc_s.so.1
  16. 7fd9aaf73000-7fd9aaf74000 r--p 00014000 08:01 1577226 /lib/x86_64-linux-gnu/libgcc_s.so.1
  17. 7fd9aaf74000-7fd9aaf75000 rw-p 00015000 08:01 1577226 /lib/x86_64-linux-gnu/libgcc_s.so.1
  18. 7fd9aaf75000-7fd9ab132000 r-xp 00000000 08:01 1576723 /lib/x86_64-linux-gnu/libc-2.17.so
  19. 7fd9ab132000-7fd9ab332000 ---p 001bd000 08:01 1576723 /lib/x86_64-linux-gnu/libc-2.17.so
  20. 7fd9ab332000-7fd9ab336000 r--p 001bd000 08:01 1576723 /lib/x86_64-linux-gnu/libc-2.17.so
  21. 7fd9ab336000-7fd9ab338000 rw-p 001c1000 08:01 1576723 /lib/x86_64-linux-gnu/libc-2.17.so
  22. 7fd9ab338000-7fd9ab33d000 rw-p 00000000 00:00 0
  23. 7fd9ab33d000-7fd9ab360000 r-xp 00000000 08:01 1576697 /lib/x86_64-linux-gnu/ld-2.17.so
  24. 7fd9ab541000-7fd9ab544000 rw-p 00000000 00:00 0
  25. 7fd9ab55b000-7fd9ab55f000 rw-p 00000000 00:00 0
  26. 7fd9ab55f000-7fd9ab560000 r--p 00022000 08:01 1576697 /lib/x86_64-linux-gnu/ld-2.17.so
  27. 7fd9ab560000-7fd9ab562000 rw-p 00023000 08:01 1576697 /lib/x86_64-linux-gnu/ld-2.17.so
  28. 7fff751ee000-7fff7520f000 rw-p 00000000 00:00 0 [stack]
  29. 7fff75361000-7fff75363000 r-xp 00000000 00:00 0 [vdso]
  30. ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
  31. Aborted
И еще есть утечка памяти:
Листинг программы
  1. valgrind -v --tool=memcheck --leak-check=yes ./test
  2. ==13378== LEAK SUMMARY:
  3. ==13378== definitely lost: 13 bytes in 2 blocks
  4. ==13378== indirectly lost: 0 bytes in 0 blocks
  5. ==13378== possibly lost: 0 bytes in 0 blocks
  6. ==13378== still reachable: 0 bytes in 0 blocks
  7. ==13378== suppressed: 0 bytes in 0 blocks

Решение задачи: «Ошибка Invalid pointer при использовании malloc и struct»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef struct
  6. {
  7.     char* first_name;
  8.     char* last_name;
  9. } Entry;
  10.  
  11. int main(void)
  12. {
  13.     Entry *e;
  14.     e = malloc(sizeof(Entry));
  15.     e->first_name = malloc (10 * sizeof(char));
  16.     memmove (e->first_name, "Dmitry", 7);
  17.  
  18.     e->last_name = malloc (10 * sizeof(char));
  19.     memmove (e->last_name, "Sidorov", 8);
  20.  
  21.     printf("%s %s\n", e->first_name, e->last_name);
  22.     free(e->first_name);
  23.     free(e->last_name);
  24.     free(e);
  25.     return EXIT_SUCCESS;
  26. }

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

  1. Подключение необходимых библиотек: , ,
  2. Создание структуры Entry с полями first_name и last_name типа char*
  3. Выделение памяти под структуру Entry с помощью malloc
  4. Выделение памяти под строку first_name с помощью malloc и memmove для копирования строки Dmitry
  5. Выделение памяти под строку last_name с помощью malloc и memmove для копирования строки Sidorov
  6. Вывод значений полей first_name и last_name на экран с помощью printf
  7. Освобождение памяти, выделенной под first_name и last_name с помощью free
  8. Освобождение памяти, выделенной под структуру Entry с помощью free
  9. Возврат успешного завершения программы с помощью return EXIT_SUCCESS

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


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

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

6   голосов , оценка 3.667 из 5

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

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

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