簡體   English   中英

將字符串數組傳遞給函數

[英]Passing array of character strings to function

我試圖將一個字符串數組(C樣式字符串)傳遞給一個函數。 但是,我不希望在函數的每個字符串的長度上放置最大大小,也不想動態分配數組。 這是我先寫的代碼:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void fun(char *s[])
{
    printf("Entering Fun\n");
    printf("s[1]=%s\n",(char *)s[1]);
}

int main(void)
{
    char myStrings[2][12];

    strcpy(myStrings[0],"7/2/2010");
    strcpy(myStrings[1],"hello");
    fun(myStrings);

    return(0);
}

我在運行時遇到了一個seg錯誤,並且編譯器發出以下警告:stackov.c:在函數'main'中:stackov.c:17:警告:從不兼容的指針類型stackov.c傳遞'fun'的參數1:5:注意:預期'char **'但參數類型為'char(*)[12]'

但是,當我將main()更改為以下內容時,它可以正常工作:

int main(void)
{
    char myStrings[2][12];
    char *newStrings[2];

    strcpy(myStrings[0],"7/2/2010");
    strcpy(myStrings[1],"hello");
    newStrings[0]=myStrings[0];
    newStrings[1]=myStrings[1];
    fun(newStrings);

    return(0);
}

當數組傳遞給函數時,數組[2] [12]是否與字符指針數組相同?

不, char array[2][12]是一個二維數組(數組數組)。 char *array[2]是一個指針數組。

char array[2][12]看起來像:

7/2/2010\0\x\x\xhello\0\x\x\x\x\x\x

其中\\ 0是NUL而\\ x是不確定的。

char *array[2]是:

0x CAFEBABEDEADBEEF

(假設32位)

第一個有24個連續字符,第二個有兩個指針(到別處的字符串的開頭)。

嘗試

void fun(char s[][12]) { ...}

也可以從c-faq中讀取: 當我將二維數組傳遞給期望指向指針的函數時,我的編譯器抱怨了

當數組傳遞給函數時,數組[2] [12]是否與字符指針數組相同?

不,它是一個二維數組。 不同之處在於指針數組包含指針,但array[2][12]實際上是一個數組數組 - 不涉及指針。

順便說一下你可以這樣做:

char* mystrings[2]={"aha", "haha"};
fun(mystrings);

char myStrings[2][12]; myStrings聲明為一個字符數組數組。 這意味着myStrings存儲為24個字節

7/2/2010.???hello.??????
‘——————————’‘——————————’
myStrings[0]myStrings[1]

哪里. 代表一個空字符和? 表示未初始化的字節。

char *newStrings[2]; newStrings聲明為字符指針數組。 這意味着newStrings存儲為2× sizeof(char*)字節

[..][..]

其中[..]表示指針對象(尚未初始化)。

如果要將不同長度的字符串傳遞給函數,則必須傳遞指針數組,而不是數組數組。 如您所見,這些是不同的布局。

一般建議:每當你在指針周圍時, 繪制圖表 (如果你可以在白板或黑板上,否則在紙上),在內存中顯示各種對象,箭頭指示指向何處。 有兩種C程序員:在遇到指針時繪制這些圖表的人,以及在頭腦中繪制圖表的真正有經驗的人員。

您的數組被聲明為二維數組,但您希望將它傳遞給函數,就像它是字符串指針的一維數組一樣。

Tom的答案是正確的,您可以省略函數參數的多維數組聲明的第一維的大小。

你的第二個解決方案是有效的,因為它顯式傳遞了一個字符串指針數組到函數。 當然,除了原始的2-D字符串數組之外,它還需要指針數組的額外開銷。

暫無
暫無

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

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