c - C. double数组和char数组中realloc的区别
问题描述
我必须动态增加双数组的长度。我知道,如何使用 char 数组来做到这一点,所以我尝试了这个:
int main() {
char * tmp = NULL;
for (int i = 1; i <= 4; i++) {
tmp = realloc(tmp, i * sizeof(char));
tmp[i] = 'i';
}
puts("char OK");
double * tmp1 = NULL;
for (int i = 1; i <= 4; i++) {
tmp1 = realloc(tmp1, i * sizeof(double));
tmp1[i] = 0;
}
return 0;
}
第一个数组工作正常。但第二个被消息粉碎realloc(): invalid next size
。
这是我的两个问题:
- 为什么这种方式在双数组中不起作用?
- 如何动态增加双精度数组的大小?
UPD:删除了一个错字
解决方案
TL;DR:两个片段都是错误的,第一个片段似乎因为未定义的行为而起作用。
详细地说,问题在于您的索引逻辑。C 使用基于 0 的索引。i
因此,在从as的值开始迭代的循环内部1
,使用
tmp[i] = .......
您正在尝试访问无效的内存,此时,只有访问tmp[i-1]
有效。
您需要使用tmp1[i-1] = 0;
, 同样。
也就是说,
- 在使用返回的指针之前,请始终检查内存分配器函数是否成功。
永远不要使用表格
pointer = realloc (pointer, ......)
因为,如果
realloc
调用失败,您最终也会丢失原始指针。引用
C11
,第 7.22.3.5 章该
realloc
函数返回一个指向新对象的指针(它可能与指向旧对象的指针具有相同的值),如果无法分配新对象,则返回一个空指针。和
[....] 如果无法为新对象分配内存,则不会释放旧对象并且其值不变。
- 始终使用临时指针变量来存储的返回值
realloc()
, - 检查调用是否成功 [not-null return value] 和
- 如果需要,然后将其分配回原始变量。
- 始终使用临时指针变量来存储的返回值
推荐阅读
- python - 试图抓取使用硒动态变化的数据?
- linux - 如何在循环中使用 GNU 并行与 shell 脚本
- angular - 如何更改 Mat-Calandar 中的显示值
- azure-active-directory - 有没有办法在 id_token 声明中添加用户的 sam_account_name ?
- ios - 从 UISearchController Swift 传递更多数据
- freemarker - Freemarker:将日期从科学记数法转换为数字
- sql - 将(翻译)从一种 sql 语法转换为另一种(从 mssql 到 oracle、h2...)
- excel - XMLhttp 请求仅从 Salesforce (Excel VBA) 返回 250 条记录
- python - Postgres 像 SQLite 那样传递元组
- django - 如何在 Django 的多对多关系中获取 models.CASCADE?