C函数声明返回指向特定大小数组的指针

时间:2017-07-13 19:25:30

标签: c

我一直在玩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);
}

提前致谢。

3 个答案:

答案 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]太奇怪,那么编码目标就需要改进。

`