c - 增加数组的大小
问题描述
请你帮我做这个练习好吗?
编写一个 C 程序,从键盘读取 6 个整数,并在数组的前 5 个位置分配前 5 个值;将第六个值存储在变量 N 中。编写一个函数,给定输入使用键盘的前 5 个值和整数 N 初始化的数组,返回调整大小以包含 5 + N 个元素的数组,这样每个新的N 个元素对应于数组中它之前的数字的总和。在 main 中,打印函数返回的数组的内容。
在main
功能中也可以。
当我必须使用该函数realloc
将数组从 size = 5 增加到 5 + N时,我遇到了问题。
这是我的代码:
int N, a, i;
int *ptr;
int arr[6];
for (i = 0; i < 5; i++) {
printf("Insert number in array, position(%d): ", i);
scanf("%d", &arr[i]);
}
N = arr[4];
a = 5 + N;
ptr = (int *)realloc(arr, sizeof(int) * a);
for (i = 4; i < a; i++) {
ptr + i = N * N; //<--- **problem!!**
}
for (i = 0; i < a; i++) {
printf("%d\n", ptr[i]);
}
free(ptr);
解决方案
您不能重新分配在函数中本地定义的数组,也不能重新分配全局定义的数组。您只能调用realloc
以前用malloc()
、calloc()
或realloc()
或NULL
指针分配的对象。因此,您必须在其中分配包含 5 个元素的初始数组main()
并在函数中重新分配它。
#include <stdio.h>
#include <stdlib.h>
int *extend_array(int *arr, int N) {
int a = 5 + N;
arr = realloc(arr, a * sizeof(int));
if (arr != NULL) {
int sum = 0;
for (int i = 0; i < 5; i++) {
sum += arr[i];
}
for (int i = 5; i < a; i++) {
arr[i] = sum;
sum += sum;
}
}
return arr;
}
int main() {
int N;
int *arr = malloc(5 * sizeof(int));
if (arr == NULL) {
printf("allocation failed\n");
return 1;
}
for (int i = 0; i < 5; i++) {
printf("Insert number in array, position(%d): ", i);
if (scanf("%d", &arr[i]) != 1) {
printf("invalid input\n");
return 1;
}
}
printf("Insert the value of N: ");
if (scanf("%d", &N) != 1) {
printf("invalid input\n");
return 1;
}
int *ptr = extend_array(arr, N);
if (ptr == NULL) {
printf("reallocation failed\n");
} else {
arr = ptr;
for (int i = 0; i < 5 + N; i++) {
printf("%d\n", arr[i]);
}
}
free(arr);
return 0;
}
赋值指定函数应将数组和数字N
作为参数,但最好将初始大小设为变量并将其传递给函数,以使代码更通用、更易于扩展且错误更少容易因为常数5
出现在许多地方。
推荐阅读
- python - pandasql sqldf的where子句中的日期比较
- node.js - 如何使用猫鼬按名称查找元素
- pandas - 大熊猫每小时平均 7 天
- javascript - 将给定数组中重复出现的元素和唯一元素分离为两个包含唯一元素和重复元素的新数组
- python - 如何检查python中的字典列表中是否存在值
- linux - 如何在汇编语言的新行上打印多个字符串
- google-maps - NoSuchMethodError:在 null 上调用了方法“toJson”。- 在 Flutter 中使用 Google 地图和 Firestore
- javascript - 无法访问我的本地服务器,标题有问题吗?
- c++ - 虚拟决赛作为安全
- javascript - 如何使用 Vue API 将样式对象转换为编译后的属性值?