我是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;
}
我的主要问题是我无法打印所有添加的名称并且还会出现分段错误。
答案 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;
然后循环用户输入并添加记录保持 跟踪已读取的记录数。由于名字 是一个指针数组,您需要分配一个名称 每次添加条目
时都是structe.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;