увеличить размер массива - PullRequest
1 голос
/ 18 апреля 2020

Можете ли вы помочь мне с этим упражнением, пожалуйста?

Напишите программу C, которая читает 6 целых чисел с клавиатуры и присваивает первые 5 значений в первых 5 позициях массива; сохранить шестое значение в переменной N. Напишите функцию, которая при заданном входном значении массива, инициализированного первыми 5 значениями с клавиатуры и целым числом N, возвращает массив с измененным размером, содержащий 5 + N элементов, так что каждый из новых N элементов соответствует сумме чисел перед ней в массиве. В основном выведите содержимое массива, возвращенного функцией.

Все нормально и в функции main.

У меня проблема, когда мне приходится использовать функция realloc для увеличения массива от размера = 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);

Ответы [ 2 ]

4 голосов
/ 18 апреля 2020

Вы не можете перераспределить массив, определенный локально в функции и не определенный глобально. Вы можете вызывать 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 в качестве аргументов, но было бы лучше сделать начальный размер переменной и передать его функции, чтобы сделать код более универсальным c, более простым для расширения и менее подверженным ошибкам, так как константа 5 появляется во многих местах.

1 голос
/ 18 апреля 2020

Если вам нужно перераспределить массив, то он изначально должен быть выделен динамически. Поэтому этот код

int arr[6];
//...
ptr = (int *)realloc(arr, sizeof(int) * a);

недействителен.

Обратите внимание на то, что в соответствии с заданием вам нужно написать функцию, которая перераспределяет массив.

Имейте в виду, что Это очень плохой стиль программирования - использовать "маги c числа", такие как 5. Вместо этого используйте именованные константы или присвойте такие числа переменным и используйте их.

Программа может выглядеть следующим образом.

#include <stdio.h>
#include <stdlib.h>

int * resize( int *a, size_t n, size_t m )
{
    int *tmp = realloc( a, ( n + m ) * sizeof( int ) );

    if ( tmp != NULL )
    {
        int sum = 0;
        size_t i = 0;

        while ( i < n ) sum += tmp[i++];
        while ( i < n + m )
        {
            tmp[i] = sum;
            sum += tmp[i++];
        }
    }

    return tmp;
}

int main(void) 
{
    size_t n = 5;
    int *a = malloc( n * sizeof( int ) );
    size_t m = 0;

    printf( "Enter %zu numbers. The last number shall be greater than 0: ", n + 1 );

    for ( size_t i = 0; i < n; i++ )
    {
        scanf( "%d", a + i );
    }

    scanf( "%zu", &m );

    int *tmp  = resize( a, n, m );

    if ( tmp != NULL )
    {
        a = tmp;
    }
    else
    {
        m = 0;
    }

    for ( size_t i = 0; i < n + m; i++ )
    {
        printf( "%d ", a[i] );
    }

    putchar( '\n' );

    free( a );

    return 0;
}

Вывод программы может выглядеть как

Enter 6 numbers. The last number shall be greater than 0: 1 2 3 4 5 6
1 2 3 4 5 15 30 60 120 240 480 960 1920 3840 7680 
...