gpt4 book ai didi

c - strlen 和 malloc : C memory leaks

转载 作者:行者123 更新时间:2023-11-30 16:01:19 25 4
gpt4 key购买 nike

此问题无效!我没有正确地释放学生!我会尽快接受向我透露这一点的答案!

我是 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))); 

线。

我是否对 strlen 有一些根本性的误用导致了错误?

最佳答案

这里有一些问题:

    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()

关于c - strlen 和 malloc : C memory leaks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6807720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com