【问题标题】:C array of array of strings字符串数组的C数组
【发布时间】:2013-04-13 16:07:00
【问题描述】:

在 C 中,我需要静态预分配一个数字数组,每个数字都与不同的字符串数组相关联。像下面这样的代码可以解决问题吗:

struct number_and_strings {
  int  nnn;
  char **sss;
}

static struct number_and_strings my_list[] = {
  {12, {"apple","banana","peach","apricot","orange",NULL}},
  {34, {"tomato","cucumber",NULL}},
  {5,  {"bread","butter","cheese",NULL}},
  {79, {"water",NULL}}
}

【问题讨论】:

  • 为什么不试试看呢?
  • 我担心它似乎会起作用,但由于对指针的一些误解,我最终会吞下或泄漏内存。
  • 指针将指向数据段中的内存位置。那里没有泄漏。
  • 不,它不会工作。数组不是指针,因此您不能使用字符串数组的初始化程序来初始化指向指针的指针。

标签: c arrays string pointers


【解决方案1】:

sss 是一个指向指针的指针。所以指针数组不能直接分配给它。您可以使用复合文字(这是 C99 功能)进行如下分配:

static struct number_and_strings my_list[] = {
      {12, (char*[]){"apple","banana","peach","apricot","orange",NULL}},
      {34, (char*[]){"tomato","cucumber",NULL}},
      {5,  (char*[]){"bread","butter","cheese",NULL}},
      {79, (char*[]){"water",NULL}}
    };

【讨论】:

  • 这不是强制转换,而是完全不同的东西,即复合文字。 (未命名对象的 C 行话和语法)
  • @FreeBud 不,AFAIK C89/90 不支持它(但 gcc 支持它作为扩展)。如果你在C99模式下编译,应该没问题。例如,如果您使用 gcc,则:gcc -std=c99 file.c.
  • 让我换个方式问:我可以在结构定义中进行哪些更改(或其他更改),以便使用 ANSI C 以这种方式(或类似方式)声明静态数组?
  • @FreeBud 您使用的是什么编译器?先直接复制我回答中的struct声明试试。
  • >> 你使用的编译器是什么——这很棘手。我在我的 Windows PC 上使用 Digital Mars C,但最终目标是作为 Apple 上的 Objective C 代码的一部分。
猜你喜欢
  • 2013-08-16
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
相关资源
最近更新 更多