而不是指出你應該改變你的代碼在這裏的一個完整的工作示例,希望顯示所需的差異。下面的代碼首先創建一個struct person
,但是當調用函數record_values()
時,您會看到它首先必須檢查dude-name是否已經指向char數組。沒有這個檢查會在您的代碼中創建內存泄漏,並且以前的dude->name
將永遠不會被釋放。它還爲字符串終結符在char數組中分配了一個額外的char空間(strcpy也會複製它)。這將避免溢出錯誤。該函數不返回任何內容,因此使其成爲void函數而不是返回int
的函數。 dude->age
的值不是指向內存空間的指針,因此不應使用strcpy
,而應使用dude->age = his-age
,它複製變量的值。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct person {
char *name;
char age;
};
struct person * record_alloc(const char *his_name, char his_age);
void record_values(struct person *dude, const char *his_name, char his_age);
void record_free(struct person * dude);
struct person * record_alloc(const char *his_name, char his_age){
struct person * dude;
dude = malloc(sizeof(struct person));
if (his_name != NULL){
record_values(dude, his_name, his_age);
} else {
dude->age = 0;
dude->name = NULL;
}
return dude;
}
void record_values(struct person *dude, const char *his_name, char his_age)
{
size_t nameSize;
if (dude->name)
free(dude->name);
nameSize = (strlen(his_name) + 1) * sizeof(char);
dude->name = malloc(nameSize);
strcpy(dude->name, his_name);
dude->age = his_age;
return;
}
void record_free(struct person * dude){
if (dude->name)
free(dude->name);
free(dude);
return;
}
int main(int argc, const char * argv[]) {
struct person * p;
// allocate and set values
p = record_alloc("John Smith", 32);
printf("%s is %i years old\n", p->name, p->age);
// set new values for p
record_values(p, "John Doe", 37);
printf("%s is %i years old\n", p->name, p->age);
// free p
record_free(p);
return 0;
}
你是什麼意思的「不工作」? – Glapa
@HimBromBeere這看起來更像是C而不是C++ –
請告訴我們,您使用純C還是C++,可能會有不同的方法來完成這兩種語言之一。 – zaratustra