- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
int *p=malloc(20);
现在Heap会分配20字节的内存。并将第一个字节的地址返回给指针 p。(假设没有返回 NULL 指针)。
现在我这样做,
int *q=realloc(p, 40);
现在他们有以下可能性:
1]。 q=p
2]。 q!=p
3]。 q=NULL
忘记了可能性 2 和 3。
现在我写:
free(p);
现在会发生什么?
前 20 个字节将变为空闲,其余字节仍将保持分配状态,还是所有 40 个字节将空闲或其他什么?
最佳答案
调用 free 会导致未定义的行为。这是推理:
函数realloc 将释放1 指针p 指向的空间指针。
p 指向的对象的生命周期2 在释放时结束。
函数 free 接收到一个指向释放空间的指针并导致未定义的行为3。
此外,realloc 调用后指针 p 的值是不确定的,它的使用可能会由于陷阱表示而导致未定义的行为。
换句话说,即使从 realloc 返回的指针指向与指针 p 相同的空间的开始,realloc 分配的对象也算作具有新生命周期的新对象,并且可能不会使用指针 p 释放.
1(引自:ISO/IEC 9899:201x 7.22.3.5 The realloc function 2)
realloc 函数释放 ptr 指向的旧对象并返回一个指向大小由 size 指定的新对象的指针。
2(引自:ISO/IEC 9899:201x 7.22.3 内存管理功能1)
已分配对象的生命周期从分配开始延长直到释放
3(引自:ISO/IEC 9899:201x 7.22.3.3 自由函数2)
否则,如果该参数与先前由内存管理返回的指针不匹配函数,或者如果空间已通过调用 free 或 realloc 释放,则行为未定义。
4(引自:ISO/IEC 9899:201x 6.2.4 Storage duration of objects 2)
指针的值在以下情况下变得不确定它指向(或刚刚过去)的对象达到其生命周期的尽头。
关于c - Malloc、Ralloc、免费,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40070858/
int *p=malloc(20); 现在Heap会分配20字节的内存。并将第一个字节的地址返回给指针 p。(假设没有返回 NULL 指针)。 现在我这样做, int *q=realloc(p, 40
我是一名优秀的程序员,十分优秀!