Ошибка 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;
}

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

  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
Похожие ответы