C语言中的字符串数组数组

4
在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}}
}

2
为什么不试一下看看呢? - Bart Friederichs
1
我担心的是它似乎可以工作,但由于对指针的某些误解,最终会出现内存泄漏或溢出的情况。 - Free Bud
指针将指向数据段中的内存位置。没有泄漏。 - Bart Friederichs
1
不,它不会起作用。数组不是指针,因此您无法使用字符串数组的初始化程序初始化指向指针的指针。 - Jens Gustedt
1个回答

5

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术语和语法表示未命名对象) - Jens Gustedt
@FreeBud 不支持,据我所知C89/90不支持它(但是gcc作为扩展支持它)。如果您以C99模式编译,那么应该没问题。例如,如果您正在使用gcc,则:gcc -std=c99 file.c - P.P
让我换个方式问:我可以在结构定义中做哪些更改(或其他更改),以便使用 ANSI C 声明静态数组的方式是这样的(或类似的方式)? - Free Bud
@FreeBud 你使用的编译器是什么?首先直接复制我的答案中的结构声明并尝试。 - P.P
你正在使用哪个编译器?
  • 这有点棘手。我在我的Windows PC上使用Digital Mars C,但最终目的地是作为Objective C代码的一部分包含在苹果设备中。
- Free Bud
那么,您可以将这些字符串保存在一个数组中,并为结构体变量分配内存,然后在循环中将这些字符串分配给结构体变量。 - P.P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接