簡體   English   中英

C函數聲明返回指向特定大小數組的指針

[英]C function declaration returning pointer to specific sized array

我一直在研究C函數聲明/定義,並提出了這些。

除了要返回指向特定大小的數組的指針之外,為什么有g1g2更好的原因?
有沒有更好的方法來編寫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);
}

提前致謝。

據我所知, g1返回指向恰好包含10個元素的char數組的指針,而g2返回指向單個char的指針,這將允許在內存中跟隨其后的任何長度的char數組。

正如C所見,由於C不會強制執行數組的邊界,因此與g2相比, g1的唯一優勢是可以在指定變量時指定大小。

如果要使用typedef重寫g1 ,則可以使用以下代碼:

typedef char (*char_array_t)[10];

char_array_t g1(int dummy)
{
 char_array_t p = malloc(sizeof *p);
 return p;
}

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來使代碼掃描更好。 您應該只typedef抽象的目的(即,以隱藏該類型的用戶實施)類型。 如果該類型的用戶需要知道類型的“陣性”的,那就不要把它隱藏一個落后typedef

我不喜歡g2因為它說謊 p不是char * ,而是char (*)[10] 那很重要

有沒有更好的書寫方式?

如果函數需要返回“指向大小為10個字符的數組的指針”,則g1()可以。 符合設計目標。

char (*g1(int dummy))[10] {
 char (*p)[10] = malloc(sizeof *p);
 return p;
}

如果函數需要返回“ 10個字符的指針”,請使用

char *allocate10char(int dummy) {
 char *p  = malloc(sizeof *p * 10);
 return p;
}

如果char (*g1(int dummy))[10]太奇怪,則編碼目標需要提高。

`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM