【问题标题】:How to initialize a dynamic array of pointers to NULL in C?如何在 C 中初始化指向 NULL 的动态指针数组?
【发布时间】:2012-01-31 14:24:22
【问题描述】:

我是 C 的新手,我不明白为什么以下两个语句不会产生相同的结果:

char *fields[14] = {NULL};

const int num_fields = 14;
char *fields[num_fields] = {NULL};

选项 1 有效,但选项 2 无效。它说“可能未初始化可变大小的对象”并给出警告“警告:数组初始化程序中的多余元素”。我在 OSX 上使用 gcc 4.2.1。

感谢您分享您的想法!

【问题讨论】:

  • 我认为这可能是因为const int 不一定是一个恒定值,这看起来很疯狂。我相信您可以获得指向 const 的指针并修改底层值。

标签: c


【解决方案1】:

第二个对象称为 VLA(可变长度数组),由 C99 定义。为了实现你想要的,你可以使用这个:

for (i = 0; i < num_fields; i++)
    fields[i] = NULL;

问题的要点是const int num_fields14 非常不同,它不是一个常量,它是只读的。

【讨论】:

  • +1 但从技术上讲,它不是初始化,而是赋值。我想说 VLA 本身不能初始化是正确的。
  • @ArmenTsirunyan 我改了措辞。
  • 感谢cnicutar的解释!
  • 在 VLA(可变长度数组)中,编译器会自动处理存储管理。由于直到运行时才知道大小,因此您不能使用初始化程序。正如大家所说。你需要一个 for 循环。
【解决方案2】:

即使您使用 const 关键字定义 num_fields,编译器也只会将其解释为变量。您可以通过定义以下宏来替代它:

#define num_fields 14

char *fields[num_fields] = {NULL};

【讨论】:

    【解决方案3】:

    虽然num_fields 有一个const 限定符,但它仍然被编译器视为变量。

    因此,您试图声明一个可变大小的数组,而初始化器({NULL} 部分)不能与它们一起使用。

    【讨论】:

    • 感谢 Blagovest Buyukliev 的回复。
    【解决方案4】:

    您的构造在 C++ 中工作,其中 const int 将被视为编译时常量(“常量表达式”),因此可用作编译时数组大小。

    (这方面是 B. Stroustrup 的 C++ 设计目标之一,尽可能消除编译时宏的需要)

    但是,在 C 中,您对“num_fields”的定义有效地使用您的预设值声明了一个只读内存位置,因此在 C 规则下不是在编译时有效的“常量表达式”,因此不能用作最外层“程序”范围内的数组大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      相关资源
      最近更新 更多