首页 > 解决方案 > 增加数组的大小

问题描述

请你帮我做这个练习好吗?

编写一个 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);

标签: cmemory-managementsummallocrealloc

解决方案


您不能重新分配在函数中本地定义的数组,也不能重新分配全局定义的数组。您只能调用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出现在许多地方。


推荐阅读