c - 为什么 free(arr) 只删除数组的前两个元素?
问题描述
我有一个简单的代码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int elms = 5;
int* a = (int*) calloc(elms, sizeof(int));
*a = elms;
for(int i = 1; i < elms; i++){
*(a + i) = i;
}
for(int i = 0; i < elms; i++){
printf("%d ", *(a + i));
}
printf("\n");
free(a);
// create new array with size increased by one
int* arr = (int*) realloc(a, (elms + 1) * sizeof(int));
*(arr + elms) = 10;
for(int i = 0; i < elms + 1; i++){
printf("%d ", *(arr + i));
}
printf("\n");
return 0;
}
在这里,我得到的输出为:
5 1 2 3 4
0 0 2 3 4 10
我的问题是为什么调用free()
只删除数组的前两个元素?它应该只删除第一个元素,或者所有元素,但为什么要删除两个元素?
如果我评论对 的调用free()
,我会得到预期的输出:
5 1 2 3 4
5 1 2 3 4 10
注意:如果我按预期将realloc
back的值重新分配给 ,则输出没有变化。a
解决方案
您使用以下方法调用未定义的行为:
free(a);
// create new array with size increased by one
int* arr = (int*) realloc(a, (elms + 1) * sizeof(int));
根据7.22.3.5 The realloc function,C 标准的第 3 段(加粗矿):
如果 ptr 与内存管理函数先前返回的指针不匹配,或者如果空间已通过调用
free
orrealloc
函数被释放,则行为未定义。
推荐阅读
- elasticsearch - 在弹性搜索 v6 中过滤后的空聚合
- java - 我的世界 java 插件中的玩家聊天事件没有做它应该做的事情
- python - 在 Python(包括 Sqlite)中,使用它作为变量从数据库中提取信息并使用它发出
- jinja2 - Jinja2 无法读取多行属性值
- r - ggplot 未在 Shiny 中显示,但在情节中有效
- ios - Apple 证书和配置文件 - 它们何时到期?
- ruby-on-rails - Errno::ECONNREFUSED(连接被拒绝 - 端口 587 的连接(2)
- django - 可以做更长的加载包django
- python - scikit learn中的GridSearchCV如何为k折挑选最佳参数
- java - 从 RESTful API 检索内容到 java 桌面应用程序中的表