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