[英]How to return char (*)[6] in c?
我想按字母順序排序字符串數組,這是c中字符數組的數組。這是我函數的主體: -
char (*)[6] sort_strings ( char (*sptr) [6])
{
//code.
//return a pointer of type char (*)[6].
}
但編譯器無法識別這種類型的返回類型。它給出了錯誤說: -
預期標識符或'('''''''令牌
那么我如何返回char(*)[6]類型的指針? 我還有另一個問題,首先看看main()
如下: -
int main(){
char names[5][6] = {
"tom",
"joe",
"adam"
};
char (*result)[6] = sort_strings (names);
//code for printing the result goes here.
return 0;
}
所以我的下一個問題是,當我調用sort strings (names)
編譯器也會給我警告: -
初始化使得整數指針不帶強制轉換
所以我的問題是: -
1.如何從函數返回char(*)[6]?
2.當我調用此函數時,為什么編譯器會給我警告?
我在Windows上的代碼塊上運行此代碼。
函數聲明看起來像變量聲明,除了變量名由函數名和參數替換。 所以:
// asdf is a pointer to an array of 6 chars
char (*asdf)[6];
// sort_strings is a function returning a pointer to an array of 6 chars
// (and with an argument which is a pointer to an array of 6 chars)
char (*sort_strings ( char (*sptr)[6] )) [6];
如果你堅持要對特定6個字符串的數組進行排序,你可以將其打包在某些struct
struct sixstrings_st {
char* ptrarr[6];
};
但是,您可能希望對任意數量的字符串進行排序。 然后你要么將這個數字作為另一個正式的參數傳遞(你也可以有一些其他的約定,比如在一些全局中存儲數組的大小,但這很難看):
void sort_strings (char**arrptr, unsigned siz);
或者您可以使用靈活的陣列成員 。
順便說一下,不要重新排序,使用qsort(3)
此外,出於可讀性目的,您通常不希望具有復雜的外觀類型。 使用typedef
,並根據需要定義struct
(可能使用union
-s)。
使用數組時要小心。 在許多情況下(特別是傳遞給函數的參數),數組被衰減為指針(注意,處理器通常不會在單個機器指令中同時處理整個數組)。 函數不能真正返回一個數組,只是一個指針(或一些struct
)。
在C編程中,通常有函數返回標量數據(例如整數或某個指針)。 返回struct
並不常見(與C ++相反,返回class
實例通常是這樣)。 當你確實返回一個struct
你通常希望它“足夠小”(否則函數返回在概念上會復制很多字節)。 順便說一下,一些ABI可能有返回兩個標量元素struct
的特定規則。 對於Linux上的x86-64 ABI ,通過兩個機器寄存器返回帶有兩個整數或兩個指針的struct
。
通常,函數返回指針(可能由malloc
獲得並填充函數),您應該定義一個約定並記錄應該對返回的指針做什么,特別是誰有責任free
它以及如何。 C編程中常見的習慣用法是定義創建函數foo_create
,這些函數分配一個復雜的數據結構struct foo_st
(通常通過調用malloc
來獲取某些struct
和其他組件的創建函數)並返回指向它的指針,並銷毀函數foo_destroy
,它們是破壞這樣的數據結構(通常是通過銷毀組件然后在作為struct foo_st*
指針傳遞的整個結構上調用free
)。
通常,在C中,您希望避免向 struct
傳遞或返回大型 數據結構 (例如大型struct
,數組, union
,...)(以避免大量數據被復制,因為C 調用約定是按值調用 )。 所以你要小心使用它們指針 :避免內存泄漏和內存損壞 。 因此,您不會返回一個已排序的數組,而是一些指向它的指針(並且您記錄了誰應該銷毀該數組,如何以及何時)...閱讀C動態內存分配甚至垃圾收集 (至少要了解術語) ,以及參考計數等基本技術。
最后,您通常不希望硬編碼像源中的6那樣的大小。 您應該想要處理任意(但合理)大小的任意字符串數組。 如果你需要硬編碼一個大小,至少給它一些可讀的名稱,例如#define MY_WEIRD_SIZE 6
和代碼MY_WEIRD_SIZE
而不是6在適當的地方......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.