【问题标题】:Array of fixed length strings in cc中的固定长度字符串数组
【发布时间】:2017-09-01 13:50:58
【问题描述】:

我想在 c 中以指针的形式有一个固定长度的字符串数组,这样我就可以为它动态分配内存。 我可以看到大量对指向字符串的指针数组的引用,但不是我想要实现的。

我想要的是能够声明一个指向 char[MAX_STRING_LENGTH] 的指针,这样我就可以为所有字符串动态分配一个连续的内存块:

char *(names[MAX_STRING_LENGTH]);  // This won't work
names = (some cast)malloc(NUM_STRINGS * MAX_STRING_LENGTH);

然后访问字符串数组:

strcpy(name, names[stringIndex]);

如何声明变量并从 malloc 中转换指针?

【问题讨论】:

  • 所以如果我跟着你,你想要一个大的 char 数组,这样你就可以在其中进行自己的分配?
  • 我想做一个二维数组的单次分配,其中第二维是固定的
  • 字符串的“长度”通常不包括空字符。考虑strlen()。代码可能需要MAX_STRING_LENGTH --> MAX_STRING_LENGTH + 1 才能正确使用names

标签: c arrays string


【解决方案1】:

您将names 声明为指针数组,而不是指向数组的指针。那将是

char (*names)[MAX_STRING_LENGTH];  // Names is a pointer to an array of char

现在你可以为指针分配内存了:

// Allocate memory for NUM_STRINGS arrays and assign the pointer to names
names = malloc(NUM_STRINGS * sizeof *names);

【讨论】:

【解决方案2】:

您想要一个指向数组 MAX_LENGTHchar 的指针使用 cdecl(请注意,cdecl 不理解 MAX_LENGTH 之类的东西,所以我们在这里使用数字代替):

% cdecl
Type `help' or `?' for help
cdecl> declare names as pointer to array 256 of char;
char (*names)[256]

我们得到正确的声明是

char (*names)[MAX_LENGTH];

但这仍然不是很有用,因为reallocation 的成本很高,因为它可能不得不将每个字符串移动到一个新位置。所以我建议你仍然使用 pointer to pointer to char

【讨论】:

    【解决方案3】:

    一些程序员已经提供了解决方案。

    一般来说,由于 C/C++ 类型可能会变得有些棘手,因此您可以利用任何半体面的 IDE 来查找正确的类型定义。

    这个技巧依赖于 C++11 的 auto 关键字,该关键字根据其初始化程序确定变量类型。生成的类型仍然可以在其他 C/C++ 版本中使用,并且不限于 C++11。

    在你的情况下,指定一个你知道并且可以转换成你想要的类型的类型:

    char names[10][10];
    

    然后分配一个auto 具有所需类型的变量:

    auto names2 = &names[0];
    

    检查names2 的实际类型并使用它。例如,在 Visual Studio 中,只需将鼠标悬停在 names2 上即可查看类型。大多数 IDE 会通过将鼠标悬停在 auto 关键字或定义的变量上来显示类型。

    例如,悬停会显示类型char (*names2)[10]

    【讨论】:

    • auto names2 = &names[0]; --> 警告:在 'names2' 的声明中类型默认为 'int' 并且肯定不适用于此 C 帖子。也许您正在使用另一种语言进行编码?
    • @chux 哦该死的,我想我再次陷入了 VS C 并不是真正的 C 陷阱……它是 C++11 auto,我将不得不更新我的答案。这种类型检查的结果仍然可以应用于 C/C++
    【解决方案4】:

    您需要了解指针数组的概念。请参阅 Dennis M. Ritchie & Kernighan 所著的《C 编程语言》一书。特别是指针和数组部分。有一些令人惊奇的东西可供阅读。在阅读并解决了书中给出的一些问题后,您可能会对指针和数组有更深入的了解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多