即使条件为真,断言也会导致我的程序崩溃

时间:2015-04-15 21:48:02

标签: c assert

我有一个函数,我断言(使用assert.h)传递的参数大于0:

DynArr* createDynArr(int cap)
{
    assert(cap > 0);
    ...
}

此行在main ..

运行
DynArr *dyn;
dyn = createDynArr(2);

我收到此错误:

main: dynamicArray.c:46: createDynArr: Assertion 'cap > 0' failed.
Abort(core dumped)

为什么要这样做?

编辑 - 这是一个更完整的例子。

这是文件dynamicArray.c中函数的结构和完整实现:​​

struct DynArr
{
    TYPE *data;     /* pointer to the data array */
    int size;       /* Number of elements in the array */
    int capacity;   /* capacity ofthe array */
};

DynArr* createDynArr(int cap)
{
    assert(cap > 0);
    DynArr *r = (DynArr *)malloc(sizeof( DynArr));
    assert(r != 0);
    initDynArr(r,cap);
    return r;
}

void initDynArr(DynArr *v, int capacity)
{
    assert(capacity > 0);
    assert(v!= 0);
    v->data = (TYPE *) malloc(sizeof(TYPE) * capacity);
    assert(v->data != 0);
    v->size = 0;
    v->capacity = capacity;
}

在一个单独的文件testDynArr.c中,我有一个main函数,我尝试创建一个DynArr结构并给它2的容量:

int main(int argc, char* argv[]){

    DynArr *dyn;
    dyn = createDynArr(2);

    printf("\n\nTesting addDynArr...\n");


  ...
}

我这样链接这些文件:

gcc -o main dynamicArray.c testDynArr.c 

然后运行main,它给出了断言错误。

1 个答案:

答案 0 :(得分:0)

我看到你使用一个值的唯一原因,当放在int类型的对象中时,该值变为负值。这似乎是您使用的整数值大于INT_MAX

至于你的代码片段,如果要更新一些细节(例如使用结构标记等),那么它将编译并成功运行。

您应该查看断言消息。它显示了cap的实际值。:)

相关问题