将字符串数组传递给函数

时间:2010-08-18 15:01:50

标签: 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 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]传递给函数时,它是否与字符指针数组相同?

5 个答案:

答案 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)

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