动态数组分配和打印元素

时间:2014-02-10 17:58:43

标签: c

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);

我无法在第一个元素之后打印动态数组的元素。

2 个答案:

答案 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的类型,则更清洁,更易于阅读,并且不会出现问题。虽然,根据您的代码,我认为您的意思是ta

do
{
    printf("enter the element");

标准输出行缓冲,意味着输出一直保持到缓冲区已满或发送换行符。要确保您的输出立即显示,请使用fflush

    fflush( stdout );
    scanf("%d",&n);
    *a=n;

a是否已正确初始化以指向任何地方? ta是不同的对象,因此分配给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;