我正在尝试将一个字符串数组(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:警告:从不兼容的指针类型传递'fun'的参数1 stackov.c: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]传递给函数时,它是否与字符指针数组相同?
答案 0 :(得分:7)
不,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个连续字符,第二个有两个指针(到别处字符串的开头)。
答案 1 :(得分:4)
尝试
void fun(char s[][12]) { ...}
答案 2 :(得分:2)
当数组[2] [12]传递给函数时,它是否与字符指针数组相同?
不,它是一个二维数组。不同之处在于指针数组包含指针,但array[2][12]
实际上是一个数组数组 - 不涉及指针。
char* mystrings[2]={"aha", "haha"};
fun(mystrings);
答案 3 :(得分:1)
char myStrings[2][12];
将myStrings
声明为一组字符数组。这意味着myStrings
存储为24个字节
7/2/2010.???hello.??????
‘——————————’‘——————————’
myStrings[0]myStrings[1]
其中.
表示空字符,?
表示未初始化的字节。
char *newStrings[2];
将newStrings
声明为字符指针数组。这意味着newStrings
存储为2×sizeof(char*)
字节
[..][..]
其中[..]
表示指针对象(尚未初始化)。
如果要将不同长度的字符串传递给函数,则必须传递指针数组,而不是数组数组。如您所见,这些是不同的布局。
一般建议:无论何时你在指针周围,绘制图表(如果可以,在白板或黑板上,否则在纸上)显示内存中的各种对象,箭头指示指向何处。有两种C程序员:在遇到指针时绘制这些图表的人,以及那些在头脑中绘制图表的经验丰富的人员。
答案 4 :(得分:0)
你的数组被声明为一个二维数组,但是你想将它传递给函数,好像它是一个字符串指针的一维数组。
Tom的答案是正确的,你可以省略函数参数的多维数组声明的第一维的大小。
你的第二个解决方案是有效的,因为它显式地将一个字符串指针数组传递给函数。当然,除了原始的2-D字符串数组之外,它还需要指针数组的额外开销。