而不是指出你应该改变你的代码在这里的一个完整的工作示例,希望显示所需的差异。下面的代码首先创建一个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