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

标签 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 会给出断言错误。

最佳答案

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

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

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

关于c - 即使条件为真,断言也会使我的程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29661531/

相关文章:

java - JUnit 中的单元测试 AssertError

c - 教育示例表明有时 printf 作为调试可能会隐藏错误

c - 如何在C中以某种方式从文件中获取输入

c - 你应该在 C 程序结束时释放吗

sql-server - 从跨平台应用程序连接到 MS SQL Server

go - 无法生成覆盖

java - 如何在 Java 中访问内部类(在断言中)

python - 在 Python 类中存储和断言类型

objective-c - 为什么在 C 中将大 double 转换为 long 有时会返回正值而有时会返回负值?

c - 在 C 中寻找类似于 assert() 而无需中止的 API/函数