双指针typedef结构数组

时间:2014-01-09 05:58:08

标签: c struct typedef

我是c编程的新手,我坚持使用它的一个typedef结构,我想做的是我想从这个结构的双指针创建一个数组

typedef struct
{
 char* firstname;
 float   price;
}Name,*pName,**ppName;

typedef struct
{
 ppName Names;
 unsigned int numPerson;
}Book;

我的主要总是给我分段错误不介意它循环它循环直到使用说要退出。

 int main(void)
{

 Book D;
 setUpCollection(&D);

  while(..)
 {


  scanf(...);
  switch(...)
  {
  case 1:
   if(!AddNewPerson(&D))
    return 1;
   break;
  case 2:
  ....
  case 3:
   ....
  default:
   printf("Please enter a valid choice");
  }
 }
 return 0;
}

void setUpCollection(Book* data){
 Name name;
 pName pname;


 pname= malloc(MAX_PERSON* sizeof(pName));

 pname= &name;

 data->Names= &pname;
 data->numPerson= 0;

}

BOOL AddNewPerson(Book* data){
 char *title = malloc(sizeof(char));
 int len;
 Name name;
 pName pname;


 scanf(...);
 len = strlen(firstname);

 name.firstname = malloc(len * sizeof(char*));
 name.firstname  = firstname;

 pname= malloc(1);
 pname= &name;

 data->DVDs[data->numPerson++] = pname;

  printf("%0.2f", data->Names[(data->numPerson)-1]->price); 

 return TRUE;
}

我的主要问题是我无法打印所有添加的名称并且还会出现分段错误。

1 个答案:

答案 0 :(得分:2)

你的程序中有很多错误,但让我提一下:


这对你来说不是很奇怪:

pname= malloc(MAX_PERSON* sizeof(pName));
pname= &name;

首先让pname指向pName数组,然后分配给&name,就会造成内存泄漏。


这是什么:

char *title = malloc(sizeof(char)); // ?

这里你分配的空间太少了

name.firstname = malloc(len * sizeof(char*));

应该是

name.firstname = malloc(len * sizeof(char) + 1);

或更具可读性:

name.firstname = malloc(len+1);

这再没有意义了:

pname= malloc(1);
pname= &name;

再次创建内存泄漏首先让pname指向1个字节的堆块,然后将其分配给data中包含的局部变量 - 一旦离开{{1},局部变量就会被释放所以数据会指向垃圾。


而是做这样的事情(我不喜欢 指针的typedef),也尝试避免命名类型 与清晰度命名变量的方式相同:

AddNewPerson()

现在分配数组的初始大小,整点 将它放在堆上是因为如果更多,数组可以增长 添加的记录超过MAX_PERSONS,因此您需要跟踪 数组中已使用记录的数量以及数量 分配的记录

typedef struct
{
  char *firstname;
  float price;
} Name;

typedef struct
{
  Name** names;
  unsigned int numPerson;
} Book;

然后循环用户输入并添加记录保持 跟踪已读取的记录数。由于名字 是一个指针数组,您需要分配一个名称 每次添加条目

时都是struct

e.g。

int allocated = MAX_PERSONS;
Book D;
D.names = malloc( allocated * sizeof(Name*) );
D.numPerson = 0; 

然后在每次迭代时检查是否有剩余分配的内存

D.names[i] = malloc( sizeof(Name) );
D.names[i]->firstname = strdup(userInputName);
D.names[i]->price = userInputPrice;