![](/img/trans.png)
[英]What is the difference between static array declaration and pointer array declaration when returning an array from the function in c
[英]C function declaration returning pointer to specific sized array
我一直在研究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);
}
提前致謝。
據我所知, 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.