c中固定长度字符串的数组

时间:2017-09-01 13:50:58

标签: c arrays string

我希望在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转换指针?

4 个答案:

答案 0 :(得分:3)

您将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);

答案 1 :(得分:2)

你想要MAX_LENGTH使用char的数组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];

然而,这仍然不是很有用,因为realloc会非常昂贵,因为它可能需要将每个字符串移动到一个新位置。所以我建议您仍然使用指向char 的指针。

答案 2 :(得分:1)

Someprogrammerdude已经提供了解决方案。

通常,由于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]

答案 3 :(得分:0)

你需要理解指针数组的概念。阅读本书" C编程语言"作者:Dennis M. Ritchie& Kernighan的。特别是指针和数组部分。有一些很棒的东西要读。在阅读并解决书中给出的一些问题之后,你可能会得到更深入的指针和数组概念。