C 将字符串数组传递给函数

C 将字符串数组传递给函数,c,C,我试图将字符串数组(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 mai

我试图将字符串数组(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);
}
当数组[2][12]被传递给函数时,它与字符指针数组不是一回事吗?

试试看

void-fun(chars[][12]){…}


另请阅读c-faq:

否,
字符数组[2][12]
是一个二维数组(数组数组数组)
char*array[2]
是指针数组

字符数组[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);

数组被声明为二维数组,但您希望将其传递给函数,就像它是字符串指针的一维数组一样

Tom的答案是正确的,您可以省略函数参数的多维数组声明的第一个维度的大小


第二个解决方案之所以有效,是因为它显式地将字符串指针的1-D数组传递给函数。当然,除了原始的二维字符串数组之外,它还需要额外的指针数组开销将
myStrings
声明为字符数组。这意味着
myStrings
存储为24字节

7/2/2010.???hello.??????
‘——————————’‘——————————’
myStrings[0]myStrings[1]
其中,
表示空字符,
表示未初始化的字节

char*新闻字符串[2]
新闻字符串
声明为指向字符的指针数组。这意味着
newStrings
存储为2×
sizeof(char*)
字节

[..][..]
其中,
[…]
表示指针对象(尚未初始化)

如果要向函数传递不同长度的字符串,必须传递指针数组,而不是数组数组。正如您在上面看到的,这些是不同的布局


一般建议:当你在指针附近时,画一些图表(如果可以的话,可以在白板或黑板上,也可以在纸上),显示内存中的各种对象,用箭头指示什么指向哪里。有两种C程序员:一种是在遇到指针时绘制此类图表的程序员,另一种是在头脑中绘制图表的真正有经验的程序员。

这样做的好处是只存储字符串所需的实际字符数。缺点是还为每个字符串分配了一个(附加)指针。但指针的易用性是主要优势。是的,我知道这是可行的,但对于实际应用程序,我无法在编译时初始化数组。@Mike:当你在函数中使用它时,数组实际上是在运行时初始化的。我被你的陈述弄糊涂了:。请注意,您随后对strcpy的调用尝试写入尚未初始化的指针。程序给出了您想要的结果,而不是崩溃,这纯粹是一种恶作剧。“您是什么意思?还有,您通过“未初始化的指针”得到了什么?”?Thanks@Mike:对不起,这是我的错误(我误读了你的代码)。没问题。我只是想确保我没有遗漏什么。
[..][..]