簡體   English   中英

將一個字符串數組作為參數傳遞給C中的函數

[英]Passing an array of strings as parameter to a function in C

我想要一個簡單的函數,它接收一個字符串並在一些解析后返回一個字符串數組。 所以,這是我的功能簽名:

int parse(const char *foo, char **sep_foo, int *sep_foo_qty) {
    int i;
    char *token;
    ...
    strcpy(sep_foo[i], token); /* sf here */
    ...
}

然后我稱之為:

char sep_foo[MAX_QTY][MAX_STRING_LENGTH];
char foo[MAX_STRING_LENGTH];
int sep_foo_qty, error;

...

error = parse(foo, sep_foo, &sep_foo_qyt);

...

這樣我在編譯期間會收到警告:

warning: passing argument 2 of 'parse' from incompatible pointer type

然后在標記為/ * sf的行中執行期間出現分段錯誤* /

我的C代碼有什么問題?

提前致謝

警告是完全正確的。 你的函數想要一個指針數組。 你給它一個數組數組。

預期:

sep_foo:
 +------+       +-----+
 |char**|--> 0: |char*|-->"string1"
 +------+       +-----+
             1: |char*|-->"string2"
                +-----+
*sep_foo_qty-1: |...  |
                +-----+

你提供的是什么:

sep_foo:
           +--------------------------------+
        0: | char[MAX_STRING_LENGTH]        |
           +--------------------------------+
        1: | char[MAX_STRING_LENGTH]        |
           +--------------------------------+
MAX_QTY-1: | ...                            |
           +--------------------------------+

具有X類型元素的數組可以“衰減”為指向XX*的指針。 但是X的值不允許在該轉換中發生變化。 只允許一次衰減操作。 你需要它發生兩次。 在您的情況下, XMAX_STRING_LENGTH -chars數組。 該函數希望X成為指向char的指針。 由於它們不相同,編譯器會發出警告。 我有點驚訝它只是一個警告,因為編譯器允許發生的事情沒有任何好處。

在您的函數中,您可以編寫以下代碼:

char* y = NULL;
*sep_foo = y;

這是合法代碼,因為sep_foo是一個char** ,所以*sep_foo是一個char* ,所以是y ; 你可以分配它們。 但是你試圖做的事情, *sep_foo 真的不是一個char* ; 它會指向一個char數組。 實際上,您的代碼將嘗試執行此操作:

char destination[MAX_STRING_LENGTH];
char* y = NULL;
destination = y;

您不能將指針分配給數組,因此編譯器會警告該調用沒有問題。

有兩種方法可以解決這個問題:

  • 更改您在調用端聲明和分配sep_foo的方式,使其與函數期望接收的內容匹配:

     char** sep_foo = calloc(MAX_QTY, sizeof(char*)); for (int i = 0; i < MAX_QTY; ++i) sep_foo[i] = malloc(MAX_STRING_LENGTH); 

    或者,等效地

     char* sep_foo[MAX_QTY]; for (int i = 0; i < MAX_QTY; ++i) sep_foo[i] = malloc(MAX_STRING_LENGTH); 
  • 更改函數的原型以接受您真正給出的內容:

     int parse(const char *foo, char sep_foo[MAX_QTY][MAX_STRING_LENGTH], int *sep_foo_qty); 

參數2應該是

char sep_foo[][MAX_STRING_LENGTH]

為了澄清,您傳遞一個指向parse()的指針並將其視為指向指針的指針。 C中的多維數組不是指針數組。 它是數組變量指向的單個內存塊。 你不能兩次取消引用它。

sep_foo被定義為數組數組。 換句話說,當你使用sep_foo ,它指向順序內存的開頭。 這是一個模型:

(assume MAX_STRING_LENGTH = 16, MAX_QTY = 2)
sep_foo       = &&0000
sep_foo[0]    =  &0000
sep_foo[0][0] = *&0000 = 12
sep_foo[0][8] = *&0008 = 74
sep_foo[1]    =  &0010
sep_foo[1][0] = *&0010 = 12


0000  12 34 56 78  9A BC DE F0  74 10 25 89  63 AC DB FE
0010  12 34 56 78  9A BC DE F0  74 10 25 89  63 AC DB FE

但是,您的函數需要一個指針數組(實際上是指向指針的指針)。 這是建模的:

sep_foo_arg       =   &&0000
sep_foo_arg[0]    =  *&&0000 = &0010
sep_foo_arg[0][0] =  *&*&0000 = 12
sep_foo_arg[0][8] = *(&*&0000 + 8) = 74
sep_foo_arg[1]    =  *&&0002 = &0020
sep_foo_arg[1][0] = *&*&0000 = 12

0000  0010 0020  xxxx xxxx  xxxx xxxx  xxxx xxxx

0010  12 34 56 78  9A BC DE F0  74 10 25 89  63 AC DB FE
0020  12 34 56 78  9A BC DE F0  74 10 25 89  63 AC DB FE

是的...語法對我的解釋可能有點混亂......

無論如何,你可以通過告訴你的函數如何處理指向的指針來解決這個問題。 特別是,您可能希望將其視為一個數組(一系列內存):

int parse(const char *foo, char (*sep_foo)[MAX_STRING_LENGTH], int *sep_foo_qty);

如果這是你的確切代碼,那么我猜測段錯誤是因為你沒有為你的解析函數中的char* token分配內存,然后在你的strcpy中使用它。

暫無
暫無

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

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