c - 在运行时定义数组大小

标签 c arrays

<分区>

我读到在声明数组时如果没有显式初始化,大小说明符是强制性的, 但是给定的代码段编译并成功运行了吗?

main()
{
   int r;
   scanf("%d",&r);
  char array[r];      //memory is not allocated at compile as value of variable is not known
  scanf("%s",array);
  printf(array);





}

最佳答案

这是利用 C99 的可变长度数组特性的有效代码。

只要 rscanf 正确设置,在 char array[r] 的分配中使用它是合法的。

不过,有几个问题需要解决:

  • 如果scanf 返回零,r 保持未初始化状态。在声明中使用它来指定数组大小是非法的。
  • 如果 scanf 读取负数,将其用作数组大小将是非法的。
  • 如果 scanf 读取的数字对于系统的自动内存空间而言太大,您将遇到未定义的行为。

最后一点非常重要:您的系统可能有足够的内存用于数组,但自动内存(通常称为“堆栈”)中没有足够的空间来分配您的数组。这可能会导致崩溃。

更好的方法是使用 malloc 动态分配您的数组,并在完成后释放它。

关于c - 在运行时定义数组大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44163939/

相关文章:

c - 如何在字符串中保存文本文件的内容

c++ - 使用 exec 对发送给子进程的随机数进行排序

c++ - 当两者都是 32 位宽时,在 C(或 C++)中使用 `unsigned long` 和 `unsigned int` 是否存在可观察到的差异?

python - 根据索引向量在 numpy 中重复行

php - 十进制数的排序问题

PHP:访问嵌套数组元素的有效方法?

c - 结构表

c++ - 使用 valgrind 忽略部分代码 - memcheck

php - 使用 php 数组创建 mysql 查询

ios - 如何访问元组字典中的值 swift 4