【问题标题】:error: free(): invalid next size (fast)错误:免费():下一个大小无效(快速)
【发布时间】:2018-04-07 15:11:14
【问题描述】:

代码如下:

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

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

【问题讨论】:

  • 您只为一个 int int *arr = malloc(sizeof(int)); 类型的对象分配了内存。所以 n 不能大于 1。

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


【解决方案1】:

此声明中的初始化程序

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

【讨论】:

  • int *arr = malloc( n * sizeof( int ) );所以基本上这是 n 个元素,而不仅仅是一个,例如: int *arr = malloc( sizeof( int ) ); ?
  • @Mytavaz 是的,内存是为 n 个 int 类型的对象分配的。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 2012-10-25
    相关资源
    最近更新 更多