声明一个变长数组的固定长度字符串

6
我需要一个字符串数组。每个字符串的长度在编译时已知,而且每个字符串占用的空间很重要。另一方面,字符串数量只在运行时才知道。请问这种情况下的语法是什么? char* data[STRLENGTH] 是错误的语法。 char** data 大部分是正确的,但 sizeof(data[0]) 是错误的——它应该等于 STRLENGTH
3个回答

10

@Daniel 是正确的,但是这段代码可能会让读者感到困惑 - 它不是通常要做的事情。为了使其更容易理解,我建议你分成两个步骤来完成:

typedef char fixed_string[STRLENGTH];
fixed_string *data;

1
这并不是那么令人困惑;指向数组的指针并不比指向其他类型的指针更复杂。只是[]的优先级要高于*,需要明确分组。 - John Bode
当我看到 char (*data) 这样的东西时,我的第一反应是找函数指针。无论如何,定义一个中间类型几乎没有任何缺点(你将通过引用而不是值传递它,但这并不总是问题)。 - zmbq
这也适用于malloc,而较新的C++编译器不会接受像(char*[12])这样的转换。 - Dave S

7
char (*data)[LEN];                   // where LEN is known at compile time
...
data = malloc(sizeof *data * rows);  // where rows is determined at run time
...
strcpy(data[i], some_name);
...
printf("name = %s\n", data[i]);
...
free(data);

请注意,data 是一个指针类型,而不是数组类型(data 是指向一个长度为 LENchar 数组的指针)。malloc 调用将动态分配足够的内存来容纳 rows 个长度为 LEN 的数组。每个 data[i] 都是类型为 char [LEN] 的数组。

6
char* data[STRLENGTH]

声明一个由指向charSTRLENTGH指针组成的数组。要声明一个指向包含STRLENGTHchar的数组的指针,使用以下语法:

char (*data)[STRLENGTH]

需要注意的一点是,如果Erik将此字符串传递到函数边界之外,他不应该使用sizeof来获取字符串的大小,因为指针衰减会导致错误。 - wkl
2
data 是一个指针,因此不存在衰减问题。另一方面,data[i] 是一个数组表达式,如果传递给函数,它将会衰减为指针。 - John Bode

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