[英]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個連續字符,第二個有兩個指針(到別處的字符串的開頭)。
當數組傳遞給函數時,數組[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.