将字符串数组传递给函数

我试图将一个字符串数组(C样式字符串)传递给一个函数。 但是,我不希望在函数的每个字符串的长度上放置最大大小,也不想动态分配数组。 这是我先写的代码:

#include  #include  #include  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]是否与字符指针数组相同?

尝试

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

另请参阅c-faq: 当我将二维数组传递给期望指向指针的函数时,我的编译器抱怨了

不, 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字符串数组之外,它还需要指针数组的额外开销。