arrays - 在函数中使用 realloc 来增加数组
问题描述
我正在尝试在函数内部调用 realloc 。我第一次调用该函数似乎有效,但我第二次调用它失败了。
void insert(struct laptop *arr, struct laptop new_laptop, int* plen){
arr = realloc(arr, (sizeof(struct laptop)*(*plen+1)));
arr[*plen] = new_laptop;
(*plen)++;
}
int main(){
struct laptop* arr = malloc(sizeof(struct laptop));
int len = 0;
int *plen = &len;
insert(arr, make_laptop("Dell", "XPS", "New", 500), plen);
display(arr[0]);
insert(arr, make_laptop("Macbook", "Pro", "New", 500), plen);
display(arr[1]);
return 0;
}
我的其余代码供参考:
struct laptop{
char *brand;
char *model;
char *condition;
float price;
};
struct laptop make_laptop(char *brand, char *model, char *condition, float price){
struct laptop new_laptop;
new_laptop.price = price;
new_laptop.brand = malloc(strlen(brand)+1);
strcpy(new_laptop.brand, brand);
new_laptop.model = malloc(strlen(brand)+1);
strcpy(new_laptop.model, model);
new_laptop.condition = malloc(strlen(condition)+1);
strcpy(new_laptop.condition, condition);
return new_laptop;
}
void display(struct laptop laptop){
printf("%s %s %s %.2f", laptop.brand, laptop.model, laptop.condition, laptop.price);
}
这里到底发生了什么?我有什么办法来解决这个问题?
解决方案
对于初学者来说,这个内存分配在 main
struct laptop* arr = malloc(sizeof(struct laptop));
是多余的。你应该写
struct laptop *arr = NULL;
arr
该函数按值接受指针
void insert(struct laptop *arr, struct laptop new_laptop, int* plen){
arr = realloc(arr, (sizeof(struct laptop)*(*plen+1)));
arr[*plen] = new_laptop;
(*plen)++;
}
也就是说,该函数处理用作参数的原始指针值的副本。
通过引用传递指针定义函数至少像
void insert(struct laptop **arr, struct laptop new_laptop, int* plen){
*arr = realloc( (arr, (sizeof(struct laptop)*(*plen+1)));
( *arr )[*plen] = new_laptop;
(*plen)++;
}
在这种情况下,该函数将被称为
insert(&arr, make_laptop("Dell", "XPS", "New", 500), plen);
或者从函数返回一个新指针,如
struct laptop * insert(struct laptop *arr, struct laptop new_laptop, int* plen){
arr = realloc(arr, (sizeof(struct laptop)*(*plen+1)));
arr[*plen] = new_laptop;
(*plen)++;
return arr;
}
并且该函数将被称为
arr = insert(arr, make_laptop("Dell", "XPS", "New", 500), plen);
注意在这样的语句中使用同一个指针是不安全的
arr = realloc(arr, (sizeof(struct laptop)*(*plen+1)));
该函数通常可以返回一个空指针。结果,先前分配的内存的地址将丢失。
你应该写例如
struct laptop *tmp = realloc(arr, (sizeof(struct laptop)*(*plen+1)));
if ( tmp != NULL )
{
arr = tmp;
//...
}
推荐阅读
- sql - 在 SQL 中获取总分钟数的 HH:mm 版本
- python - 构建深度 CNN 时出现 InvalidArgumentError
- javascript - 在烧瓶中发布数据后,无法使用 JSON 数据打开新的 html 页面
- javascript - 有人可以解释一下为什么 alert.length 返回“0”以及为什么 Array.length 或 Object.length 返回 1
- java - JAVA 在用户输入的两个日期之间打印和分隔日期(周末和工作日)
- angular-cli - 如何从观察者文件中排除 node_modules
- plotly-dash - 为什么 plotly 的配置在 dash 中不起作用?
- wordpress - Wordpress 根文件夹内的错误 404 MyBB 文件夹
- docker - Docker-Compose:更新后无法访问服务
- python - 我在哪里可以找到在自然图像上训练的预训练变分自动编码器?