我试图创建一个简单的数据库程序,但是当我到达这一行时
int idSearch(product* itens, int id) {
int i = 0;
for(i; i < size; i++) {
if(itens[i].id == id) //<=== This line
return i;
}
return ITEM_NOT_FOUND;
}
程序停止响应。 size在程序开头设置为全局变量
FILE* flog;
FILE* db;
FILE* sizef;
int size = 100;
此函数由
调用void newProduct(product* itens, char name[64], int id, float price) {
int pos = idSearch(itens, 0);
if(idSearch(itens, id) != ITEM_NOT_FOUND) {
printf("Erro, o produto ja existe");
return;
}...
项目定义为
itens = (product*) calloc(sizeof(product), size);
和产品是struct
定义为
typedef struct{
char name[64];
int id;
float price;
int amount;
} product;
首先我认为问题在于我没有使用->
运算符,但是当我尝试编译时说它不对。
我在Windows 7 x64上使用Code :: Blocks with GCC编译器
**编辑:整个代码可以在这里找到:http://hastebin.com/atulajubar.tex
希望尽快听到答案,提前致谢
答案 0 :(得分:2)
**编辑:您正在调用calloc()错误。签名是:void *calloc(size_t nelem, size_t elsize);
您首先给它的大小,然后元素的数量。切换它,看看您的问题是否已解决。
此外,在致电(AFTER THE FIX :) itens = (product*) calloc( size, sizeof(product) );
时,
在执行此操作后检查itens是否为NULL非常重要。如果calloc无法返回适当数量的内存,它会返回一个我相信的NULL指针。检查一下,因为如果你收回NULL,那就是你的问题。
一种优秀,简单,便携的检查方式:
if(!itens){
fprintf(stderr, "Error! Could not allocate memory!\n");
exit(1);
}
另外,正如WhozCraig建议的那样,请确保您的代码包含#include <stdlib.h>
,根据其手册页要求使用calloc()。
答案 1 :(得分:1)
这是错误的:
if((db = fopen(DB_PATH, RB))==NULL)
{
if((db = fopen(DB_PATH, RWB))==NULL)
{
exit(1);
}
else
{
itens = (product*) calloc(sizeof(product), size);
fwrite(itens, sizeof(product), size, db);
rewind(db);
}
}
fread(itens, sizeof(product), size, db);
如果当前工作目录中有DB_PATH文件,则第一个fopen()
将成功,items
分配将永远不会发生。只有当文件不但成功创建时,items
才会包含有效分配,假设calloc
有效。
应删除else
条件:
// note calloc parameter order addressed.
itens = calloc(size, sizeof(product));
if (itens == NULL)
{
perror("Failed to allocate items.");
exit(EXIT_FAILURE);
}
if((db = fopen(DB_PATH, RB))==NULL)
{
if((db = fopen(DB_PATH, RWB))==NULL)
exit(EXIT_FAILURE);
fwrite(itens, sizeof(product), size, db);
rewind(db);
}
fread(itens, sizeof(product), size, db);
还有大量的错误检查需要处理,但无论如何都需要解决这个问题。