【问题标题】:Dinamically growing Array until key input Error: invalid next size动态增长的数组,直到键输入错误:下一个大小无效
【发布时间】:2016-06-12 14:26:15
【问题描述】:

我会扩展数组,直到程序接收到“-1”作为输入。每次我将当前数组扩展 1 但在 7 次输入后我有“无效的下一个大小:0x0000000000d47010”

void extend(int *v, int i)
{
    int *p;
    p= (int *) realloc(v, (i+1)*sizeof(int));
    if(p!=NULL)
    v=p;    
}
int main()
{
    int *v;
    v= malloc(sizeof(int));
    int n=0;
    int i=0;

    while(n!=-1)
    {
    scanf("%d", &n);
    v[i]=n;
    extend(v,i);
    i++;
    }
    return 0;
}

编辑 使这项工作可行的可能解决方案

void extend(int *v, int i)
{
    int *p;
    p= (int *) realloc(v, (i+1)*sizeof(int));
    if(p!=NULL)
    v=p;    
}

int main()
{
        int *v;
        v= malloc(sizeof(int));
    int n=0;
    int i=0;

        while(n!=-1)
        {
        scanf("%d", &n);
        if(n!=-1)
        {
        extend(v,i);
        v[i]=n;
        i++;
        }
    }

    prodottoScalare(v, i);

        return 0;
}

【问题讨论】:

    标签: c arrays pointers malloc realloc


    【解决方案1】:

    函数参数是它的局部变量。所以在这个语句中的函数extend

    v=p;
    

    分配了局部变量v,该变量在退出函数后被销毁。原来用作参数的指针本身不会改变。

    您需要通过引用将原始指针传递给函数。

    也是这个while循环的逻辑

    while(n!=-1)
    {
    scanf("%d", &n);
    v[i]=n;
    extend(v,i);
    i++;
    }
    

    不正确。 scanf 输入的值可以等于-1,或者可以遇到流的结尾。尽管如此,数组还是被扩展了。

    你还应该释放所有分配的内存。

    考虑到在 C 中没有参数的 main 应该像这样声明

    int main( void )
    

    程序可以如下所示

    #include <stdlib.h>
    #include <stdio.h>
    
    size_t extend( int **a, size_t n, int value )
    {
        int *p = realloc( *a, ( n + 1 ) * sizeof( int ) );
    
        if ( p != NULL )
        {
            *a = p;
            ( *a )[n++] = value;
        }
    
        return n;
    }
    
    int main( void ) 
    {
        int *a = NULL;
        size_t n = 0;
        int value;
    
        while( scanf( "%d", &value ) == 1 && value != -1 )
        {    
            n = extend( &a, n, value );    
        }
    
        for ( size_t i = 0; i < n; i++ ) printf( "%d ", a[i] );
        printf( "\n" );
    
        free( a );
    
        return 0;
    }
    

    如果进入

    0 1 2 3 4 5 6 7 8 9 -1
    

    那么程序输出会是这样的

     1 2 3 4 5 6 7 8 9 
    

    另一个函数的实现可能是这样的

    #include <stdlib.h>
    #include <stdio.h>
    
    _Bool /* or int */ extend( int **a, size_t n )
    {
        int *p = realloc( *a, ( n + 1 ) * sizeof( int ) );
        _Bool /* or int */ success = p != NULL;
    
        if ( success ) *a = p;
    
        return success;
    }
    
    int main( void ) 
    {
        int *a = NULL;
        size_t n = 0;
        int value;
    
        while( scanf( "%d", &value ) == 1 && value != -1 )
        {    
            if ( extend( &a, n ) ) a[n++] = value;    
        }
    
        for ( size_t i = 0; i < n; i++ ) printf( "%d ", a[i] );
        printf( "\n" );
    
        free( a );
    
        return 0;
    }
    

    结果将与相同输入的第一个演示程序中的结果相同。

    【讨论】:

    • 你的解决方案可行,我更改了答案并提出了解决方案,它可行,但它错了吗?
    • @user4789408 新解决方案中的函数在通过值而不是通过引用传递原始指针时存在相同的问题。:)
    【解决方案2】:

    注意函数extend的指针vint *v是按值传递的,赋值语句v=p不会改变传递给函数extend的值。所以,int *v 的参数在这里通过引用传递:

    void extend(int *&v, int i)
    {
        int *p;
        p= (int *) realloc(v, (i+1)*sizeof(int));
        if(p!=NULL)
        v=p;    
    }
    int main()
    {
        int *v;
        v= malloc(sizeof(int));
        int n=0;
        int i=0;
    
        while(n!=-1)
        {
        scanf("%d", &n);
        v[i]=n;
        extend(v,i);
        i++;
        }
        return 0;
    }
    

    【讨论】:

    • C 中没有引用类型。:)
    猜你喜欢
    • 2023-01-12
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    相关资源
    最近更新 更多