函数指向char的指针是否需要在C中进行内存分配

时间:2013-11-26 09:12:52

标签: c

使用这种数据结构在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++;
   }
}

5 个答案:

答案 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成员。