c - 动态增长数组直到键输入错误 : invalid next size

标签 c arrays pointers malloc realloc

我会扩展数组直到程序接收到“-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;
}

最佳答案

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

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

关于c - 动态增长数组直到键输入错误 : invalid next size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37775342/

相关文章:

c - 在 C 中处理 MacOSX 上的 BSTR

javascript - 为什么 reducer 会忽略数组中的第一项?

ruby - 在 Ruby 中,如何获得奇数元素的总和?

c++ - 指针:C++ 要求所有声明都有类型说明符

pointers - 在 Go 中,我如何检查一个值是(任何)指针类型?

c - C 中的 int * 和 int *[100] 类型之间有什么区别?

c - 将数据写入.cof 文件

c - 将 C .obj 文件链接到 Delphi 应用程序,解析标准 C 依赖项

python - 我如何正确处理多维 numpy 数组

c - 如何警告指向超出范围的局部变量的指针