尝试引用struct数组时,C程序崩溃

时间:2014-07-07 23:55:19

标签: c arrays windows struct crash

我试图创建一个简单的数据库程序,但是当我到达这一行时

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

希望尽快听到答案,提前致谢

2 个答案:

答案 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);

还有大量的错误检查需要处理,但无论如何都需要解决这个问题。