strlen и malloc: утечки памяти C - PullRequest
0 голосов
/ 24 июля 2011

Этот вопрос недействителен!Я не правильно освободил студентов!Я приму ответ, который открыл мне это, как только мне позволят!

Я новичок в C и практикую malloc.В общем, я пишу библиотеку связанных списков;Эта функция create_student входит в число многих функций, которые я собираюсь использовать для тестирования библиотеки связанных списков.Проблема в том, что ... я запускаю valgrind и вызываю эту функцию, и это указывает на наличие нескольких утечек памяти, вызванных этим первым malloc.Насколько мне известно, все выглядит солидно:

typedef struct Student
{
        char* first_name; /* This will be malloc'd!*/
    char* last_name; /* This will also be malloc'd */
    int grade;
    long id;
} Student;


Student* create_student(const char* first_name, const char* last_name, int grade, long gtid)
{

        /* First allocate a student on the heap */
        Student *newStudentp = (malloc(sizeof(Student)));


    /* Allocate enough space for the first and last names */
    newStudentp -> last_name = (malloc(strlen(last_name)));
    newStudentp -> first_name = (malloc(strlen(first_name)));



        // AND copy the first and last name to the first and last name fields in the struct   
    strncpy(newStudentp -> first_name, first_name, strlen(first_name));
    strncpy(newStudentp -> last_name, last_name, strlen(last_name));



        /* Set the grade and id */
    newStudentp -> grade = grade;
    newStudentp -> id = id;

        */ 
    return newStudentp;
}

Мои сообщения об ошибках от valgrind (их несколько) выглядят так:

==4285==    9 bytes in 1 blocks are definitely lost in loss record 8 of 8
==4285==    at 0x4025BD3: malloc (vg_replace_malloc.c:236)
==4285==    by 0x804855B: create_student (test.c:24)
==4285==    by 0x8048748: main (test.c:109)

строка 24 - это

newStudentp -> last_name = (malloc(strlen(last_name))); 

line.

Есть ли у меня какое-то фундаментальное неправильное использование strlen, которое вызывает ошибку?

1 Ответ

1 голос
/ 24 июля 2011

Здесь есть несколько проблем:

    newStudentp -> last_name = (malloc(strlen(last_name)));
    newStudentp -> first_name = (malloc(strlen(first_name)));

strlen дает только длину до, но не включая завершающую '\0'. Но это также должно быть сохранено, поэтому вы должны использовать strlen(last_name) + 1 в обоих случаях.

Кроме того, ваш strncpy() лучше выполнять с использованием размера выделенного буфера, а не исходной строки, чтобы вы могли избежать записи за верхнюю границу массива. Но так как вы уже использовали malloc(strlen(...) + 1), вы можете просто использовать strcpy() здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...