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