この質問は無効です!私は適切に学生を解放していませんでした!私はこれを私に許されているように素早く私に明らかにした答えを受け入れるでしょう!strlenとmalloc:Cメモリリーク
私はCを新しくmallocを練習しています。壮大な範囲で、私はリンクリストライブラリを書いています。このcreate_student関数は、リンクリストライブラリをテストするために使用する多くの関数の1つです。問題は...私はvalgrindを実行してこの関数を呼び出し、最初のmallocによって引き起こされたいくつかのメモリリークがあることを示します。それはすべて最高の私の知識に、固体になります:valgrindのから
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;
}
私のエラーメッセージが(いくつかがある)のようになります。
==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の基本的な誤用がありますか?
あなたのStudent構造体はどのように無料ですか? – Mat
'strlen'は' \\ '文字を含む文字列_not_の長さを返します。 – Hasturkun
'last_name'の' malloc'は '\ 0 'のスペースを入れるために' strlen(last_name)+ 1'文字を割り当てるべきです( 'first_name'と同じです) – jonsca