C语言 断言即使条件为真也会使我的程序崩溃



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

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

当这条线在主线中运行时。

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,我有一个主要函数,我尝试创建一个DynArr结构并赋予它2的容量:

int main(int argc, char* argv[]){
    DynArr *dyn;
    dyn = createDynArr(2);
    printf("nnTesting addDynArr...n");

  ...
}

我像这样链接这些文件:

gcc -o main dynamicArray.c testDynArr.c 

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

我看到您使用的值的唯一原因,该值在放置在 int 类型的对象中时变为负值。也就是说,您似乎正在使用大于INT_MAX的整数值

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

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

最新更新