arrays - C动态增长数组重新分配问题
问题描述
我想在 C 中实现动态增长的数组。我将文件中的单词读取到char ** 数组中,当数组已满时,它的大小增加了 2。但是当我重新分配内存时,数组的前两个元素是丢失的。我尝试使用 lines = realloc() 但它崩溃了。我究竟做错了什么?
测试.txt:
test1
test2
test3
test4
test5
test6
test7
test8
test9 (no end of line)
我的输出:
─
đ%
test3
test4
test5
test6
test7
test9
代码:
#include <stdio.h>
#include <malloc.h>
int size = 8;
char **read(FILE *input, char **lines, int *lSize) {
for (int i = 0; !feof(input); i++) {
*lSize += 1;
if (*lSize > size) {
realloc(lines, (size *= 2) * sizeof(char *));
for (int j = (*lSize) - 1; j < size; j++) {
lines[j] = (char *) malloc(1024 * sizeof(char));
}
}
fscanf(input, "%s", lines[i]);
}
return lines;
}
int main(){
FILE *file = fopen("test.txt", "r");
if (file == NULL) {
return -1;
}
char **lines = malloc(size * sizeof(char *));
for (int i = 0; i < size; ++i) {
lines[i] = malloc(1024 * sizeof(char));
}
int lsize = 0;
read(file, lines, &lsize);
printf("lSize:%d\n", lsize);
printf("size:%d\n", size);
for (int i = 0; i < lsize; ++i) {
printf("%s\n", lines[i]);
}
for (int i = 0; i < size; ++i) {
free(lines[i]);
}
free(lines);
return 0;
}
解决方案
给定char **read(FILE *input, char **lines, int *lSize)
做什么:realloc(lines, (size *= 2) * sizeof(char *))
做什么?
lines
好吧,它可能通过移动它来改变指向的内存块的大小。这就是它返回一个新指针的原因。仅将新指针分配回lines
(就其本身而言)不会有太大帮助,因为它只会更新lines
此函数中的局部变量。
但幸运lines
的是也从函数返回。但是它的返回值在 main 中被忽略了,所以在read
返回之后,lines
in main 可能是一个虚假的指针。主要做lines = read(file, lines, &lsize)
。
推荐阅读
- python - 如何知道我的一个子弹精灵是否与我的敌人/巨石精灵相撞?- 游戏
- arrays - 比较 Ruby 中二维数组的子数组,并显示结果数组与现有和遗漏的项目
- css - CSS - 雪佛龙不会自行旋转
- javascript - javascript单行条件
- java - 在这种特定情况下,JPA Repository 给出从 Integer 到 Long 的强制转换异常的原因是什么?
- kotlin - Kotlin:如何在挂起函数返回后立即执行某些操作?
- kotlin - 自定义 kotlin 多平台项目的依赖项不在类路径中
- php - 保管箱中的令牌到期问题
- c# - 如何在 find 中使用 where 进行复杂的搜索查询?
- angular - 角度参数:可选与查询