簡體   English   中英

如何在c中返回char(*)[6]?

[英]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.

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