结构体指针动态分配内存问题

dangdang0883 2007-10-27 06:51:02
struct book *pBok;
struct book* tempPtr = NULL;
FILE *fp;
int capability=10;
system("cls");
fp = fopen("bok.dat","r");
gets(bookId);

if ( fp == NULL )
{
printf("读取图书信息失败!\r\n");
return 0;
}
pBok=(book*)malloc(sizeof(book)*capability);\\分配内存
tempPtr=pBok;
while(!feof(fp))
{
if(pBok='\0')
{
capability=capability*2;
pBok = realloc(tempPtr,sizeof(book)*capability);
}

完全错误,大家能告诉我应该怎么写吗?
...全文
722 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
asmst 2007-10-31
  • 打赏
  • 举报
回复
修正我上面帖子的内容,非常抱歉!
我在上面说到:
“如果要分配好几次内存,你必须得定义一个数组,用来保存,每次分配得到的新地址,你自己先把分配一次的搞定再慢慢实现。
如果只是分配了一次内存又或者每次分配的内存位置和原来的恰好一样,
pBOk=tempPtr;就把指针指到第一个数据了。因为tempPtr之前帮你保存了首地址。”

我的这些说法是错误的,今天才突然意识到,如果要分配好几次内存,只要分配成功,你都可以将新分配到的地址赋给tempPtr,(前提是你每次要分配的内存都比前一次的大),如果读写完成或者内存分配失败后要访问第一个元素,将tempPtr赋给pBok就可以了,没有我想的那么麻烦!Sorry!我给你的那段代码按照这个改一下就行了。

如果我在13楼所说的影响了楼主的热情,再次表示抱歉!

楼主怎么突然销声匿迹了?没人回帖就心灰意冷了?
好好努力吧,以后好好鄙视我们!

dangdang0883 2007-10-28
  • 打赏
  • 举报
回复
怎么把 pBok 这个指针指到第一个数据啊
dangdang0883 2007-10-28
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>



typedef struct book
{
char bookId[50];
char bookName[200];
float bookPrice;
char bookType[50];
char bookAuthor[200];
}book;
//图书管理系统标题。
void Title()
{
//system("color 8A");
system("cls");
printf("\t ========================================================\r\n");
printf("\t 图 书 管 理 系 统\n");
printf("\t ========================================================\r\n");
printf("\t 1.添加图书信息\n\n");
printf("\t 2.修改图书信息\n\n");
printf("\t 3.删除图书信息\n\n");
printf("\t 4.查询图书信息\n\n");

}
//让用户从控制台输入图书信息
book getBook()
{
book bok;
system("cls");
printf("\n请输入图书信息\r\n");

printf("图书书号:");
gets(bok.bookId);

printf("图书名称:");
gets(bok.bookName);

printf("类型:");
gets(bok.bookType);

printf("价格:");
scanf("%f",&bok.bookPrice);

fflush(stdin);

printf("作者:");
gets(bok.bookAuthor);



return bok;

}
//显示图书信息
void showBook(book bok)
{
printf("\t ========================================================\r\n");
printf("\t 图 书 信 息 \n");
printf("\t ========================================================\r\n");
printf("\t 图书书号:");
puts(bok.bookId);

printf("\r\n\t 图书书名:");
puts(bok.bookName);

printf("\r\n\t 图书价格:");
printf("%f \r\n",bok.bookPrice);

printf("\r\n\t 图书类型:");
puts(bok.bookType);

printf("\r\n\t 图书作者:");
puts(bok.bookAuthor);
}
//现实图书信息
//void showBook(book* bok)
//{
// printf("\t ========================================================\r\n");
// printf("\t 图 书 信 息 \n");
// printf("\t ========================================================\r\n");
// printf("图书书号:");
// puts(bok->bookId);
//
// printf("\r\n图书书名:");
// puts(bok->bookName);
//
// printf("\r\n图书价格:");
// printf("%f ",&bok->bookPrice);
//
// printf("\r\n图书类型:");
// puts(bok->bookType);
//
// printf("\r\n图书作者:");
// puts(bok->bookAuthor);
//}
////保存图书信息
void SaveBook(book* pBok)
{
FILE* fp;
fp = fopen("bok.dat","a");
//文件不存在
if ( fp == NULL )
{
fp = fopen("bok.dat","w");
}

if ( fp == NULL )
{
printf("写入图书信息失败!\r\n");
return;
}

fwrite(pBok,sizeof(book),1,fp);
fclose(fp);
Title();

}
//按照图书书号查询信息
void searchBookId()
{
struct book* pBok;
struct book* tempPtr = NULL;
FILE *fp;
int capability=10;
int n=0;
char bookId[50];
int i=0;
system("cls");
printf("\t ========================================================\r\n");
printf("\t 通 过 图 书 的 书 号 查 询 \n");
printf("\t ========================================================\r\n");
printf("\t 请输入图书的书号:");
fp = fopen("bok.dat","r");
gets(bookId);

if ( fp == NULL )
{
printf("读取图书信息失败!\r\n");
//return 0;
}
pBok=(book*)malloc(sizeof(book)*capability);
if(pBok==NULL)
{
printf("分配内存失败!\r\n");
exit(0);
//return 0;
}
tempPtr=pBok;
while(!feof(fp))
{
//fread(pBok,sizeof(book),1,fp);
//if(pBok=='\0')
//{
// capability=capability*2;
// pBok = realloc(tempPtr,sizeof(book)*capability);
//}
//
//n++;
if(n >=capability)
{
capability=capability*2;
pBok = realloc(tempPtr,sizeof(book)*capability);
if(pBok==tempPtr)
{
pBok+=n;
}//跳过已经读取过的内存;
else if (pBok==NULL)
{
printf("分配内存失败!\r\n");
//return 0;
}//内存分配失败
}
fread(pBok,sizeof(book),1,fp);
n++;
pBok++;
}
pBok[0].bookName;

for(i=0;i<n;i++)
{
if(!strcmp(pBok[i].bookId,bookId))
{
showBook(pBok[i]);

}
}
fclose(fp);


}
//图书查询标题
void viewBookTitle()
{
char chioceSearchBook;
system("cls");
printf("\t ========================================================\r\n");
printf("\t 图 书 查 询 \n");
printf("\t ========================================================\r\n");
printf("\t 1.通过图书书号查询\n\n");
printf("\t 2.通过图书书名查询\n\n");
printf("\t 3.通过图书类型查询\n\n");
printf("\t 4.通过图书书价查询\n\n");
printf("\t 5.通过图书作者查询\n\n");
printf("\t 6.查询入库图书的平均价格\n\n");
chioceSearchBook=getch();
switch(chioceSearchBook)
{
case '1':
searchBookId();
break;
case '4':

break;
}


}
//选择项目
void chioceItem(int choice)
{
book pBok;
switch( choice )
{
case '1':
pBok = getBook();
SaveBook(&pBok);
break;
case '4':
viewBookTitle();
break;
}
}


main()
{

char choice;
loop:Title();
choice = getch();
chioceItem(choice);
//goto loop;

}
dangdang0883 2007-10-28
  • 打赏
  • 举报
回复
pBok++;
写了就有问题,不写就只能一次取一条纪录,调了我半天也调不出来
asmst 2007-10-28
  • 打赏
  • 举报
回复
我看你还是先把程序搞简单点,就只是分配一次内存好了(分配的数目可稍微大点),

如果要分配好几次内存,你必须得定义一个数组,用来保存,每次分配得到的新地址,你自己先把分配一次的搞定再慢慢实现。

如果只是分配了一次内存又或者每次分配的内存位置和原来的恰好一样,
pBOk=tempPtr;就把指针指到第一个数据了。因为tempPtr之前帮你保存了首地址。

还有你的程序真的是很乱,pBok这个变量一会儿是指针,一会儿又是struct book,p前缀本身表示指针的意思,普通变量最好不要用p开头。
你自己都会被搞晕的,何况我们这些对这个程序没有你上心的局外人!

asmst 2007-10-27
  • 打赏
  • 举报
回复
自己好好体会,我说的多了, 你想的就少了。
我为什么要判断?判断为真的话,我干了些什么事情?

这对学习编程很不好!如果我错了,请指出来。
dangdang0883 2007-10-27
  • 打赏
  • 举报
回复
if(n >=capability) 看不懂啊,555555555555555
asmst 2007-10-27
  • 打赏
  • 举报
回复
1.如果返回NULL,那么分配内存失败,否则就成功;

2.你要读入的文件内容和你的struct结构匹配吗?如果匹配,你可以这样:
while(!feof(fp)) {
if(n>=capability) {
capability=capability*2;
pBok = realloc(tempPtr,sizeof(book)*capability);
if(pBok==tempPtr) pBok+=n;//跳过已经读取过的内存;
else if (pBok==NULL) do something.....//内存分配失败
}
fread(pBok,sizeof(struct book),1,fp);
n++;
pBok++;
}
dangdang0883 2007-10-27
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>



typedef struct book
{
char bookId[50];
char bookName[200];
float bookPrice;
char bookType[50];
char bookAuthor[200];
}book;
//图书管理系统标题。
void Title()
{
//system("color 8A");
system("cls");
printf("\t ========================================================\r\n");
printf("\t 图 书 管 理 系 统\n");
printf("\t ========================================================\r\n");
printf("\t 1.添加图书信息\n\n");
printf("\t 2.修改图书信息\n\n");
printf("\t 3.删除图书信息\n\n");
printf("\t 4.查询图书信息\n\n");

}
//让用户从控制台输入图书信息
book getBook()
{
book bok;
system("cls");
printf("\n请输入图书信息\r\n");
printf("图书书号:");
gets(bok.bookId);

printf("类型:");
gets(bok.bookType);

printf("图书名称:");
gets(bok.bookName);

printf("价格:");
scanf("%f",&bok.bookPrice);

printf("作者:");
gets(bok.bookAuthor);

//fflush(stdin);

return bok;

}
//现实图书信息
void showBook(book bok)
{
printf("\t ========================================================\r\n");
printf("\t 图 书 信 息 \n");
printf("\t ========================================================\r\n");
printf("图书书号:");
puts(bok.bookId);

printf("\r\n图书书名:");
puts(bok.bookName);

printf("\r\n图书价格:");
printf("%f ",&bok.bookPrice);

printf("\r\n图书类型:");
puts(bok.bookType);

printf("\r\n图书作者:");
puts(bok.bookAuthor);



}
//保存图书信息
void SaveBook(book* pBok)
{
FILE* fp;
fp = fopen("bok.dat","a");
//文件不存在
if ( fp == NULL )
{
fp = fopen("bok.dat","w");
}

if ( fp == NULL )
{
printf("写入图书信息失败!\r\n");
return;
}

fwrite(pBok,sizeof(book),1,fp);
fclose(fp);
Title();

}
//按照图书书号查询信息
void searchBookId()
{
struct book *pBok;
struct book* tempPtr = NULL;
FILE *fp;
int capability=10;
int n=0;
char bookId[50];
int i=0;
system("cls");
printf("\t ========================================================\r\n");
printf("\t 通 过 图 书 的 书 号 查 询 \n");
printf("\t ========================================================\r\n");
printf("\t 请输入图书的书号:");
fp = fopen("bok.dat","r");
gets(bookId);

if ( fp == NULL )
{
printf("读取图书信息失败!\r\n");
return 0;
}
pBok=(book*)malloc(sizeof(book)*capability);
tempPtr=pBok;
while(!feof(fp))
{
fread(pBok,sizeof(book),1,fp);
if(pBok=='\0')
{
capability=capability*2;
pBok = realloc(tempPtr,sizeof(book)*capability);
}

n++;
}
for(i=0;i<n;i++)
{
if(pBok[i].bookId==bookId)
{
showBook(pBok[i]);

}
}
fclose(fp);

}
//图书查询标题
void viewBookTitle()
{
char chioceSearchBook;
system("cls");
printf("\t ========================================================\r\n");
printf("\t 图 书 查 询 \n");
printf("\t ========================================================\r\n");
printf("\t 1.通过图书书号查询\n\n");
printf("\t 2.通过图书书名查询\n\n");
printf("\t 3.通过图书类型查询\n\n");
printf("\t 4.通过图书书价查询\n\n");
printf("\t 5.通过图书作者查询\n\n");
printf("\t 6.查询入库图书的平均价格\n\n");
chioceSearchBook=getch();
switch(chioceSearchBook)
{
case '1':
searchBookId();
break;
case '4':

break;
}


}
//选择项目
void chioceItem(int choice)
{
book pBok;
switch( choice )
{
case '1':
pBok = getBook();
SaveBook(&pBok);
break;
case '4':
viewBookTitle();
break;
}
}


main()
{

char choice;
loop:Title();
choice = getch();
chioceItem(choice);
goto loop;

}
全部代码,但是没写完
dangdang0883 2007-10-27
  • 打赏
  • 举报
回复
2. pBok=(book*)malloc(sizeof(book)*capability); 返回值你根本就没有检查,是否分配了内存你也不知道;

怎么检查啊?

3.if(pBok== '\0 ') 这句也是错的,指针怎么能和字符比较呢?
你大概是想判断已经分配的内存是否够用,可是原文中根本就没看见你从文件中读取内容到内存!
一个while(!feof(fp)) 不会帮你把文件读进内存的,它只是判断文件指针是否到了文件尾部。

我是想判断是否够用
dangdang0883 2007-10-27
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>



typedef struct book
{
char bookId[50];
char bookName[200];
float bookPrice;
char bookType[50];
char bookAuthor[200];
}book;

void showBook(book bok)
{
printf("\t ========================================================\r\n");
printf("\t 图 书 信 息 \n");
printf("\t ========================================================\r\n");
printf("图书书号:");
puts(bok.bookId);

printf("\r\n图书书名:");
puts(bok.bookName);

printf("\r\n图书价格:");
printf("%f ",&bok.bookPrice);

printf("\r\n图书类型:");
puts(bok.bookType);

printf("\r\n图书作者:");
puts(bok.bookAuthor);
}

void searchBookId()
{
struct book *pBok;
struct book* tempPtr = NULL;
FILE *fp;
int capability=10;
int n=0;
char bookId[50];
int i=0;
system("cls");
printf("\t ========================================================\r\n");
printf("\t 通 过 图 书 的 书 号 查 询 \n");
printf("\t ========================================================\r\n");
printf("\t 请输入图书的书号:");
fp = fopen("bok.dat","r");
gets(bookId);

if ( fp == NULL )
{
printf("读取图书信息失败!\r\n");
return 0;
}
pBok=(book*)malloc(sizeof(book)*capability);
tempPtr=pBok;
while(!feof(fp))
{
if(pBok='\0')
{
capability=capability*2;
pBok = realloc(tempPtr,sizeof(book)*capability);
}
fread(pBok,sizeof(book),1,fp);
n++;
}
for(i=0;i<n+1;i++)
{
if(pBok[i].bookId==bookId)
{
showBook(pBok[i]);

}
}
fclose(fp);

}
chenfengking 2007-10-27
  • 打赏
  • 举报
回复
难道这个就是你的全部代码???不是的话全部贴出来
asmst 2007-10-27
  • 打赏
  • 举报
回复
加上两句:typedef struct book book;
book *pBok;

1.pBok=(book*)malloc(sizeof(book)*capability);

book这种类型在你的原文中根本没定义! 把它用typedef 定义出来!


2. pBok=(book*)malloc(sizeof(book)*capability); 返回值你根本就没有检查,是否分配了内存你也不知道;

3.if(pBok= '\0 ') 这句也是错的,指针怎么能和字符比较呢?
你大概是想判断已经分配的内存是否够用,可是原文中根本就没看见你从文件中读取内容到内存!
一个while(!feof(fp)) 不会帮你把文件读进内存的,它只是判断文件指针是否到了文件尾部。
dangdang0883 2007-10-27
  • 打赏
  • 举报
回复
pBok=(book*)malloc(sizeof(book)*capability);\\分配内存

这一句是不是错得很厉害啊

70,032

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧