我一直在玩C函数声明/定义,并想出了这些。
除了想要返回指向特定大小数组的指针之外,是否有g1
优先于g2
的原因?
有没有更好的方法来编写g1
(使用typedef?等)?
#include <stdlib.h>
char (*g1(int dummy))[10]
{
char (*p)[10] = malloc(sizeof *p);
return p;
}
char * g2(int dummy)
{
char (*p)[10] = malloc(sizeof *p);
return (void *)p;
}
int main()
{
g1(10);
g2(20);
}
提前致谢。
答案 0 :(得分:2)
据我所知,g1
返回指向包含10个元素的char
数组的指针,而g2
返回指向单个char
的指针,将允许在内存中跟随它的任何长度的char
数组。
看作C不会强制执行数组的边界,g1
超过g2
的唯一优势就是能够在分配变量时指定大小,就像你提到的那样
如果您想使用g1
重写typedef
,可以使用以下内容:
typedef char (*char_array_t)[10];
char_array_t g1(int dummy)
{
char_array_t p = malloc(sizeof *p);
return p;
}
答案 1 :(得分:2)
g1
更“正确”,因为它准确地反映了您要返回的对象的类型(指向char
的10元素数组的指针)。你通常不会看到返回指向数组的指针的函数,因为数组大小必须在编译时修复,限制了它的用处,而且我们大多数人下意识地避免编写这样的代码,因为它太过该死的眼睛。如果我正在编写一个分配2D数组的函数,我通常将其写为
void g1( size_t rows, size_t cols, char (**p)[cols] )
{
*p = malloc( sizeof **p * rows );
}
int main( void )
{
char (*table)[10];
g1( 5, 10, &table );
if ( table )
{
...
}
}
允许我利用VLA语义(在C99或更高版本中),使其变得灵活而不会过度丑陋。
你可以输入一些丑陋的东西:
typedef char MyType[10];
MyType *g1( int dummy );
{
MyType *p = malloc( sizeof *p );
...
return p;
}
但我总是使用typedef
来改善代码扫描。您应该只为{em>抽象目的typedef
类型(即,从类型的用户隐藏实现)。如果该类型的用户需要知道该类型的“array-ness”,那么 not 将其隐藏在typedef
后面。
我不喜欢g2
,因为谎言。 p
不是char *
,而是char (*)[10]
。 很重要。
答案 2 :(得分:1)
有更好的写作方法吗?
如果函数需要返回&#34;指向大小为10个字符的数组的指针&#34;然后g1()
没问题。它符合设计目标。
char (*g1(int dummy))[10] {
char (*p)[10] = malloc(sizeof *p);
return p;
}
如果函数需要返回&#34;指向10个字符的指针&#34;然后使用
char *allocate10char(int dummy) {
char *p = malloc(sizeof *p * 10);
return p;
}
如果char (*g1(int dummy))[10]
太奇怪,那么编码目标就需要改进。
`