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