传递char数组作为参数

时间:2012-07-30 01:39:52

标签: c function pointers

有人可以向我解释一下我在这里不明白吗?

我试图将参数作为“字符串”传递(我知道c中没有字符串),以便稍后可以将该字符串与其他函数一起使用,例如它必须传递的文件名。 但我不知道它为什么不接受它或它应该是什么类型

#include <stdio.h>

int main ( int argc, char *argv[] )
{
    char *array= argv[0];
    foo(*array);
}

void foo( char *array) 
// notice the return type - it's a pointer
{
    printf(array);
}

非常感谢!

3 个答案:

答案 0 :(得分:17)

你应该这样调用这个函数:

foo(array);

你正在做的是取消引用指针,它返回一个char,这是字符串中的第一个字符。

您的printf电话也应如下所示:

printf("%s", array);

您的整个固定代码应如下所示:

#include <stdio.h>

void foo(char *array)
{
    printf("%s", array);
}

int main ( int argc, char *argv[] )
{
    // TODO:  make sure argv[1] exists
    char *array= argv[1];
    foo(array);
}

答案 1 :(得分:5)

当您说foo (*array)时,您将数组衰减为指向第一个元素的指针,以便取消引用该元素,为您提供第一个字符。这就是你想要传递给函数的东西。省略星号,然后传递array使其衰减成你需要的指针。

另一个问题是您没有正确使用printf。首先,这是一个reference。您需要传递一串令牌,这些令牌告诉编译器接下来要接受哪种类型的参数,因为它无法说明。在您的情况下,您的字符串将包含"%s"以告诉它期望char *,然后您将array作为char *参数传递。

printf ("The string is %s", array);

答案 2 :(得分:1)

argv是一个字符指针数组,这意味着argv将存储您作为命令行参数传递的所有字符串的地址。

所以argv[0]将为您提供作为命令行参数传递的第一个字符串的地址,您将其存储到array函数中的指针变量main中。

现在你必须只将地址传递给函数foo,但是你要传递该字符串的第一个字符。例如,如果您的第一个命令行参数为temp.txt,则您将字符t传递给函数foo。所以在foo函数内部,你有一个char指针变量array,因为将分配字符t的ASCII值。然后你将它传递给printf,它将该ASCII值作为地址,它将尝试访问该地址进行打印,这将导致崩溃(意外行为)。

所以你必须只将命令行参数的地址传递给函数foo,如下所示。

foo(array);

printf(array) - 此处printf会将格式说明符作为字符串(%s),它将尝试打印从地址array开始的所有字符,直到它遇到空字符\0

但最好添加printf,如下所示

printf("%s", array);