将字符串数组传递给函数
我试图将一个字符串数组(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字符串数组之外,它还需要指针数组的额外开销。