【问题标题】:C : How to make the size of an array dynamic?C:如何使数组的大小动态化?
【发布时间】:2014-12-29 15:26:43
【问题描述】:

我从书中读到:《C Primer Plus》,它告诉我在 C99 标准中,可以使用以下语法:

    int b=4;
    char a[b];

但是当我将此代码放入 vs2013 时,它告诉我“表达式必须具有恒定值”。

这本书有错吗?还是有一些我不知道的关于 vs2013 的新功能?

【问题讨论】:

  • malloc 通常用于动态调整数组大小。
  • Visual Studio 因不正确支持 C 而闻名。
  • VS2013 不是 C 编译器。
  • 微软仍然只支持C89/C90,不支持C99,也不支持C11。
  • Microsoft 目前在 Visual Studio 2013 中支持 C99 标准的子集,而可变长度数组是缺失的部分之一。如果需要运行时大小,您可以使用 C 预处理器定义这是编译时已知大小还是内存分配(malloc()alloc() 等)。另请参阅why is alloca not considered good practice

标签: c arrays visual-studio-2013 c99 c11


【解决方案1】:

这叫Variable Length Arrays,我猜你的VS2013编译器不支持它们。

我建议您切换到另一个编译器。 GCCClang/LLVM 的最新版本支持 VLA,并且它们支持 C99 甚至大部分 C11

实际上,我什至建议将您的开发工作和系统切换到Linux。那么开发工具通常是free software,作为整个系统。

否则,使用指针,例如从malloc(3)(或calloc)获得;但是,您应该测试分配是否失败,然后调用free。避免使用memory leaks(如果可用,请使用valgrind 之类的工具)。也许您的编译器支持非标准但广泛可用的alloca(3)。也可以考虑在程序范围内使用garbage collector,例如Boehm's convervative GC:然后您将使用GC_malloc 而不是malloc,但您不需要调用GC_free

【讨论】:

  • 我试图习惯 linux 中的 eclipse,但就是不习惯。还有一些人向我推荐 vim 编辑器。更糟糕的是,我什至不知道如何使用它
  • 你可以在 Linux 下使用 emacsgeditgeany(或许多其他编辑器)。
  • 我只是一个初学者...我不知道如何使用那些普通的编辑器...我认为我最好还是继续使用 IDE
【解决方案2】:

VS2013 不支持变长声明。

声明数组时,不能在括号内输入非常量值:

char a[b];

由于您从用户那里获取大小,编译器无法提前知道char array a 需要多少内存。在这里最简单的事情(尤其是对于练习)就是选择一个相对较大的值并使其保持不变,例如:

字符 a[1024];

然后,如果您想小心(并且应该),您可以检查是否 (b > 1024),如果用户想要的 b 超出了预先分配的范围,则打印错误。

如果你想变得花哨,你可以定义 char a[] 没有预先设置的大小,比如 char *a; ,然后你用 malloc 分配它:

a = (char *)malloc(sizeof(char) * b);

那么你也必须稍后释放char a[],当你完成它时:

free(a);

希望对您有所帮助!

【讨论】:

  • @ArcherJohn 你没听明白吗?
  • 我的意思是我现在还在学习C,我还没有完成那部分
  • @ArcherJohn 哦,好吧,读一遍codingunit.com/c-tutorial-the-functions-malloc-and-free
  • 所有 3 个在功能上都相同,因此这是一种风格选择 - 您可以在这里选择。我发现 a = malloc(b * sizeof*a); 最适合编码、理解和维护。我喜欢b * sizeof*a vs sizeof*a * b,因为它模仿了calloc(nelem, elem_size)
  • -1、char a[]char*a 不一样。您必须阅读有关数组和指针的基础知识以及它们在 C 中的不同之处。
猜你喜欢
  • 2011-05-03
  • 2013-10-22
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 2012-04-17
  • 2012-10-02
相关资源
最近更新 更多