Dinamically growing Array until key input Error: invalid next size

Dinamically growing Array until key input Error: invalid next size

我会扩展数组直到程序接收到“-1”作为输入。每次我将当前数组扩展 1,但在输入 7 次后,我有 "invalid next size: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;
}

函数参数是它的局部变量。所以在函数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;
}

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

注意函数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;
}