为什么可以创建一个数组,其大小由用户输入确定而没有malloc()?

时间:2018-04-09 11:08:23

标签: c arrays malloc

以下两种方法都适用于创建数组,其大小由用户输入决定。

我总是认为数据结构的大小'由编译后的用户确定必须使用malloc()创建。 示例一说明了这一点。

但是,示例二显示了一个更简单的方法,不需要malloc()。

示例#1:创建和数组,其大小由用户输入决定。使用Malloc()。

int main() {
  int N;

  printf( "Number:" );
  scanf( "%d", &N );

  int *ptr = createArray(N);

  for (int i = 0; i < N; i++) {
     printf("%d\n", ptr[i]);
  }

 free(ptr);
 return 0;
}

int *createArray(int N) {
  int *ptr = malloc(N);

  for (int i = 0; i < N; i++) {
    ptr[i]=N;
  }

  return ptr;
}

示例#2:创建和数组,其大小由用户输入决定。不使用Malloc()。

int main() {

  int N;

  printf( "Number:" );
  scanf( "%d", &N );

  int arr[N];

  for (int i = 0; i < N; i++) {
     arr[i] = N;
  }
  for (int i = 0; i < N; i++) {
     printf("%d\n",arr[i] );
  }

  return 0;
}

我的问题是,为什么在示例2中不需要malloc(),即使程序在编译时不知道数组大小?

1 个答案:

答案 0 :(得分:4)

示例2使用在C99引入的可变长度数组(VLA)。

接受没有约束的VLA的用户输入是危险的;如果堆不足,malloc()将失败并返回NULL。另一方面,VLA没有定义处理或指示失败的方法,通常从更有限的堆栈空间分配。

另一方面,VLA是真正的数组,sizeof(arr)计算数组的大小,而不是指针的大小(特别是不是编译时常量)。