如何根据c中的用户输入扩展数组

how to expand an array based on user input in c

我正在尝试编写一个程序,询问用户数组的大小,如果再次询问他们,则数组的大小将根据他们输入的数字增加。

int main()
{
   int size;
   int n;
   printf("Size of array: ");
   scanf("%d", &n);
   int *ptr = (int*)malloc(n*sizeof(int));
   size = n;
   int n1;  
   do {
       printf("Input the increase size of the array: ");
       scanf("%d", &n1);
       size += n1;
       int *ptr = realloc((size)*sizeof(int));
   } while (n1 != -1);

  return 0;
}


这是我得到的,但我怎样才能将它移动到一个函数中

  • 您必须包含相应的 headers 才能使用标准库。
  • 您必须传递旧指针才能重新分配给 realloc()
  • 您必须为指针变量指定另一个名称才能获得 realloc() 的 return 值,而不是遮蔽(隐藏)变量以存储指向数组的指针。
  • 您应该检查 malloc()realloc() 的 return 值(以及 scanf() 以检查它们是否成功。
  • malloc() 家族的选角结果是 considered as a bad practice

固定码:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int size;
   int n;
   printf("Size of array: ");
   if (scanf("%d", &n) != 1) return 1;
   int *ptr = malloc(n*sizeof(int));
   if (ptr == NULL) return 1;
   size = n;
   int n1;  
   do {
       printf("Input the increase size of the array: ");
       if (scanf("%d", &n1) != 1) return 1;
       size += n1;
       int *new_ptr = realloc(ptr, (size)*sizeof(int));
       if (new_ptr == NULL) return 1;
       ptr = new_ptr;
   } while (n1 != -1);

  return 0;
}

对于初学者来说,调用函数 realloc

int *ptr = realloc((size)*sizeof(int));

不正确。该函数需要两个参数。

如果你想编写一个函数来改变动态分配数组的大小,那么它可以像下面这样

int resize( int **a, size_t n )
{
    int *tmp = realloc( *a, n * sizeof( int ) );

    if ( tmp != NULL ) *a = tmp;

    return tmp != NULL;
} 

并且函数可以被调用,例如

do {
    n1 = -1;
    printf("Input the increase size of the array: ");
    scanf("%d", &n1);
} while ( n1 != -1 && resize( &ptr, size += n1 ) );

    
if ( scanf( "%d", &n1 ) == 1 )
{
  int *tmp = realloc( ptr, (size + n1) * sizeof *ptr );
  if ( tmp )
  {
    ptr = tmp;
    size += n1;
  }
}

如果realloc不能满足请求,它将returnNULL并保留原来的缓冲区;如果您将结果分配回 ptr,您将 运行 失去对该内存的唯一引用的风险。因此,最好将结果分配给一个临时指针值,并确保在更新 ptr.

之前它不是 NULL

此外,在您知道 realloc 成功之前,您不想更新尺码。

将其放入函数中:

bool resize( int **ptr, int *size )
{
  int n1;
  bool success = false;

  printf( "Increase the size by: " );
  if ( scanf( "%d", &n1 ) == 1 )
  {
    int *tmp = realloc( *ptr, (*size + n1) * sizeof **ptr );
    if ( tmp )
    {
      *ptr = tmp;
      *size += n1;
      success = true;
    }
    else
    {
      fputs( "realloc could not extend the buffer\n", stderr );
    }
  }
  else
  {
    fputs( "Error or bad value on input\n", stderr );
  }
  return success;
}

你会称它为

int main( void )
{
  int size = 0;
  int *ptr = NULL;
  ...
  if ( resize( &ptr, &size ) )
    // do stuff with ptr
  else
    // handle resize error

如果你只想将内存分配移动到一个函数中,你可以这样做:

int *allocate_array(int *ptr,size_t siz)
{
    return realloc(ptr,size * sizeof(int));
}

int main()
{
    int n, n1, size, *ptr = NULL;

    printf("Size of array: ");
    scanf("%d",&n);
    ptr = allocate_array(ptr,n);
    size = n;
    do {
        printf("Input the increase in the array size: ");
        scanf("%d",&n1);
        size += n1;
        ptr = allocate_array(ptr,size);
    } while (n1 > 0);
    return 0;
}

请注意,您对 realloc 的调用不正确,因为第一个参数必须是指向现有数组的指针。此外,您创建了一个新的 ptr,其范围只是 while 循环,然后在循环之外不再存在。

可以使用realloc函数重新分配内存

void *realloc(void *ptr, size_t 大小);