t=(int*)malloc(sizeof(int));
do
{
printf("enter the element");
scanf("%d",&n);
*a=n;
printf("%d",a[i]);
a=(int*)realloc(t,sizeof(int));
i++;
} while(i<4);
我无法在第一个元素之后打印动态数组的元素。
答案 0 :(得分:1)
a=(int*)realloc(t,sizeof(int));
您每次在循环中尝试将动态内存重新分配给一个整数大小。而是将局部变量count
作为要读入的元素数量,
int count = 0;
do
{
printf("enter the element");
scanf("%d",&n);
printf("%d",a[i]);
a = (int*)realloc(t, count * sizeof(int));
a[count - 1] = n;
i++;
} while(i<4);
free(a);
答案 1 :(得分:0)
很多问题:
t=(int*)malloc(sizeof(int));
不要投射malloc
的结果(在C中);它是不必要的,并且在较旧的编译器中它可以抑制有用的诊断。同样,使用实际对象的大小,而不是类型;这将为您节省一些维护麻烦:
t = malloc( sizeof *t );
如果您决定更改t
的类型,则更清洁,更易于阅读,并且不会出现问题。虽然,根据您的代码,我认为您的意思是t
为a
。
do
{
printf("enter the element");
标准输出行缓冲,意味着输出一直保持到缓冲区已满或发送换行符。要确保您的输出立即显示,请使用fflush
:
fflush( stdout );
scanf("%d",&n);
*a=n;
a
是否已正确初始化以指向任何地方? t
和a
是不同的对象,因此分配给t
并不意味着a
指向任何意义上的错误。其次,*a
相当于a[0]
;你确定你不想写
a[i] = n;
特别是考虑到这一行:
printf("%d",a[i]);
a=(int*)realloc(t,sizeof(int));
同上;删除演员,使用对象本身的大小:
a = realloc( t, sizeof *a );
但是,这也存在问题。你实际上并没有扩展你的数组;你继续分配与开始时完全相同的空间量。并且你继续使用相同的起始指针,这可能与你最近的结果不同。
i++;
} while(i<4);
以下是我认为你正在尝试做的事情:
a = malloc( sizeof *a );
i = 0;
do
{
printf( "enter a the element: " );
fflush( stdout );
scanf( "%d", &a[i] );
printf( "%d\n", &a[i] );
int *tmp = realloc( a, sizeof *a * (i+2) ); // +2 since i starts from 0
if ( tmp ) // the array by one element
a = tmp; // only assign if realloc succeeded
} while ( ++i < 4 );
通常,一次扩展一个元素是昂贵且低效的;通常,您会一次扩展数组中的一些元素,从而减少您调用realloc
的次数:
size_t count = START_SIZE;
T *a = malloc( sizeof *a * count );
...
if ( idx == count )
{
T *tmp = realloc( a, sizeof *a * (2 * count) ); // double the size of the buffer
if ( tmp ) // each time we run up against
{ // the limit.
a = tmp;
count *= 2;
}
}
a[idx] = new_value;