使用这种数据结构在c中定义一个函数:
typedef struct {
int number;
char name[25];
} person;
person rep[100];
int key=0;
定义此函数时是否存在内存分配问题: (我只是一个初学者:我不知道内存分配意味着什么)
void add_person(int num, char *name){
if (key<100){
rep[key].number = num;
strcpy(rep[key].name, name);
key++;
}
}
答案 0 :(得分:1)
您的代码中不需要任何显式分配(如图所示)。定义
person rep[100];
使编译器为100 person
个结构分配空间。并使用成员字段定义
char name[25];
每个person
结构在name
中有25个字符的空格(即最多24个字符的字符串,加上字符串终结符)。
答案 1 :(得分:1)
对于您的add_person,您不必担心内存泄漏。 但是你需要将key添加为全局变量(在rep之后)或者将其定义为add_person中的静态变量,如下所示:
static int key = 0;
但是这行有问题
strcpy(rep[key].name, name);
如果add_person的输入名称超过24个字符,则会导致在rep.name之外写入strcpy。 在长度为25时,名称不再以空值终止,导致读取的任何函数读取它并且(最好的情况)进入下一个人(他们的数字显示为垃圾或其他随机字符),或者(最坏的情况)在rep数组和你的程序段错误之外。
您应该检查名称是否短于25。
正确的做法是拥有char * name;在函数中,然后在add_person中执行以下副本:
rep[key].name = malloc( strlen(name)+1 );
strcpy( rep[key].name, name );
在这种情况下,你应该做一个让人自由的功能
free_person(struct person* p)
{
free(p->name);
}
答案 2 :(得分:1)
函数的指针与此完全不同。
你拥有的是具有char *
(char
指针)的函数。如果您调用此函数,则将其内容传递给“new”person
struct。
这个person
结构包含一个(相当小的)数组,其中可以保存名称,因此存在内存分配(这意味着保留一个专用的存储区)。
但请注意:如果调用者传递超过25个字符的字符串,您认为会发生什么?是的,它会“破坏”它背后的内存区域的内容。
因此,您必须注意并使用strncpy(rep[key].name, name, sizeof rep[key].name)
。由于strncpy()
的创建者似乎已经睡眠(“如果源长于num,则在目的地末尾隐式附加无空字符”),您将不得不添加此空字符 - 这表示C中字符串的结尾 - 由你自己:
rep[key].name[sizeof rep[key].name - 1] = '\0'
如果字符串较短,strcpy()
已添加了自己的'\0'
,如果没有,我们会在此处剪切。
答案 3 :(得分:0)
你的功能定义很好
关于key
变量的事情:它应该被定义为全局变量
答案 4 :(得分:0)
第person rep[100];
行保留了存储100个人对象的空间,所以不存在内存分配问题。
在现实生活中,您还需要更加小心,不要将超过24个字符的名称写入name
成员。