错误:free():下一个大小无效(快)

时间:2018-04-07 15:11:15

标签: c memory memory-management malloc undefined-behavior

以下是代码:

#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)

我看过其他类似的帖子,但没有一个能解决我的问题。

2 个答案:

答案 0 :(得分:0)

此声明中的初始化程序

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

答案 1 :(得分:0)

由于您使用int *arr = malloc(sizeof(int));仅为一个整数分配内存,并且您尝试将n元素存储到该整数中,因此它会崩溃。

首先扫描n值,然后使用nmalloc()元素分配内存。

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;
}