c语言中的定长字符串数组

c语言中的定长字符串数组,c,arrays,string,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_LENG

我希望在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 (*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);

名称
声明为指针数组,而不是指向数组的指针。那就是

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

使用
cdecl
,您需要指向
char
的数组
MAX\u LENGTH
(请注意,cdecl不理解
MAX\u LENGTH
之类的内容,因此我们在这里使用一个数字):

我们知道正确的声明是

char (*names)[MAX_LENGTH];

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

您希望使用
cdecl
使用指向char
的数组
MAX\u LENGTH
的指针(请注意,cdecl不理解
MAX\u LENGTH
,因此我们在这里使用一个数字):

我们知道正确的声明是

char (*names)[MAX_LENGTH];

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

一些编程人员已经提供了解决方案

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

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

在您的情况下,请指定一种您知道且可以转换为所需类型的类型:

char names[10][10];
然后用所需类型分配一个
auto
变量:

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


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

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

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

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

在您的情况下,请指定一种您知道且可以转换为所需类型的类型:

char names[10][10];
然后用所需类型分配一个
auto
变量:

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


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

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

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

所以,如果我跟着你,你想有一个大的字符数组,这样你就可以在里面自己分配吗?我想对一个二维数组进行一次分配,其中第二个维度是固定的,字符串的“长度”通常不包括is null字符。考虑<代码> STRULL()/<代码>。代码可能需要MAX\u STRING\u LENGTH-->MAX\u STRING\u LENGTH+1才能正确使用名称。因此,如果我听你的,你希望有一个大字符数组,以便你可以在其中进行自己的分配吗?我想对二维数组进行一次分配,其中第二个维度是固定的“长度”字符串的长度通常不包括is null字符。考虑<代码> STRULL()/<代码>。代码可能需要MAX\u STRING\u LENGTH-->MAX\u STRING\u LENGTH+1才能正确使用名称。谢谢,我试过了,但无意中发现了malloc的演员阵容。你会怎么做这样的演员阵容?@Dan(也许不应该)。谢谢,我试过了,但无意中发现了来自malloc的演员阵容。你会怎么做这样的演员阵容?@Dan(可能不应该)。
autonames2=&names[0]-->警告:在“names2”的声明中,类型默认为“int”,肯定不能与此C文章一起使用。也许你在用另一种语言编写代码?@chux哦,该死的,我想我又爱上了VSC不是真正的C陷阱。。。这是C++11
auto
,我必须更新我的答案。此类型检查的结果仍然可以应用于C/C++,尽管
auto names2=&names[0]-->警告:在“names2”的声明中,类型默认为“int”,并且将证书