ошибка: free(): неверный следующий размер (быстро)

Вот код:

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

int main() {
    int *arr = malloc(sizeof(int));
    int n;
    printf("input number:\t");
    scanf("%d", &n);
    for(int i = 0; i < n; i++) {
            scanf("%d", &arr[i]);
    }
    for(int i = 0; i < n; i++) {
            printf("%d", arr[i]);
    }
    free(arr);

    return 0;
}

Он работает до scanf, а затем просто падает:

1234875770417Aborted (core dumped)

Я просмотрел другие сообщения, похожие на этот, но ни один из них не решает мою проблему.


person armin84    schedule 07.04.2018    source источник
comment
Вы выделили память только для одного объекта типа int int *arr = malloc(sizeof(int)); Так что n не может быть больше 1.   -  person Vlad from Moscow    schedule 07.04.2018


Ответы (2)


Инициализатор в этом объявлении

int *arr = malloc(sizeof(int));

выделяет память только для одного объекта типа int. Так что в этом случае n не может быть больше 1.

Вы должны написать хотя бы

int main( void ) {
    int n;
    printf("input number:\t");
    scanf("%d", &n);
    int *arr = malloc( n * sizeof(int));
    //...

Также было бы лучше объявить переменную n как имеющую тип unsigned int вместо типа int.

Учтите, что согласно стандарту C функция main без параметров должна быть объявлена ​​как

int main( void )

Вот обновленная программа.

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

int main(void) 
{
    unsigned int n = 0;

    printf( "input a non-negative number:\t" );
    scanf( "%u", &n );

    int *arr = malloc( n * sizeof( int ) );

    for ( unsigned int i = 0; i < n; i++ ) 
    {
        scanf( "%d", &arr[i] );
    }

    for ( unsigned int i = 0; i < n; i++ ) 
    {
        printf( "%d ", arr[i] );
    }
    putchar( '\n' );

    free( arr );

    return 0;
}

Его вывод может выглядеть как

input a non-negative number:    10
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
person Vlad from Moscow    schedule 07.04.2018
comment
int *arr = malloc(n * sizeof(int)); так что в основном это n элементов, а не только один, например: int *arr = malloc( sizeof( int ) ); ? - person armin84; 07.04.2018
comment
@Mytavaz Да, память выделена для n объектов типа int. - person Vlad from Moscow; 07.04.2018

Поскольку вы выделили память только для одного целого числа, используя int *arr = malloc(sizeof(int));, и вы пытаетесь сохранить в нем элементы n, поэтому происходит сбой.

Сначала отсканируйте значение n, а затем выделите память для n элементов с помощью malloc().

int main() {
        int n;
        printf("input number:\t");
        scanf("%d", &n);
        int *arr = malloc(n*sizeof(*arr)); /*it's generic it allocated memory for any type */
        if(arr == NULL) {
           printf("memory allocation failed \n");
           exit(0);
        }
        for(int i = 0; i < n; i++) {
                scanf("%d", &arr[i]);
        }
        for(int i = 0; i < n; i++) {
                printf("%d", arr[i]);
        }
        free(arr);
        return 0;
}
person Achal    schedule 07.04.2018