将指针传递给函数

时间:2009-06-19 06:57:42

标签: c pointers

我对我的计划有疑问

#include<stdio.h>

int myFunc(char **);
main()
{
    char *a[2]={"Do","While"};
    myFunc(a);
}

int myFunc(char **P)
{
    /* Here I want to print the strings passed but I'm unable to
       print the strings I just tried the below statement which
       printed just the first letter which is 'D'*/
       printf("%c",**P);
}

当我尝试

printf("%s",**P);

我遇到了运行时错误。那么有人可以帮帮我吗?

由于 马杜

8 个答案:

答案 0 :(得分:11)

将size作为参数,以允许函数知道数组中有多少个字符串。然后,您应该迭代数组并打印每个数组。

int myFunc( char** p, int size)
{
  for( int i = 0; i < size; ++i)
  {
     printf("%s", p[i]);
  }
}

稍后编辑(根据要求:-))

int main( int, char**)
{
   char *a[2]={"Do","While"};
   myFunc( a, 2); // Could be myFunc( a, sizeof(a)/sizeof(char*));
   // ...
   return 0; 
}

答案 1 :(得分:8)

太多的星星 - 试试

printf("%s",*P);

您需要%s格式说明符 - %c仅适用于单个字符。

如果要打印所有字符串,则需要在数组中传递字符串数,然后从循环中打印这些字符串。

检查CătălinPitiş建议的代码。要传递字符串数,可以调用以下函数:

myFunc(a, sizeof(a)/sizeof(a[0]));

答案 2 :(得分:5)

for( int i = 0; i < 2; i++ ) {
    char* string = P[i];
    printf( "%s", string );
}

你应该使用某种方法将数组大小传递给函数 - 或者将它作为int参数传递,

int myFunc(char **P, int size)
{
    for( int i = 0; i < size; i++ ) {
        //whatever here
    }
}

或者总是向数组附加一个零值,并且只有在找到零值时才循环。

char* array[] = { "String1", "String2", 0 };    

否则你将很难维护代码。

答案 3 :(得分:4)

我喜欢objective-c样式的nil(0)终止数组:

void myFunc(char **P)
{
    while (*P)                   // loop to iterate over all strings until 0
       printf("%s\n",*P++);      // print and move to next element in array
}

int main()
{
    char *a[]={"Do","While",0};  // added 0 to null terminate array,
    myFunc(a);                   // kind of like string
}

输出:

Do
While

答案 4 :(得分:1)

首先,好消息:a的类型等同于char **,因此您将有效参数传递给myFunc()

第一个问题是%c是格式说明符,表示打印单个字符。由于**P是一个计算单个字符的表达式,因此您的第一个版本完全按照您的要求执行。那不是你想要的。

第二个版本接近语法正确。它应该是printf("%s", *P),其中*P是一个表达式,它求值为指向以空字符结尾的ASCII字符串的指针。在这种情况下,它评估为“Do”。此版本不会打印两个字符串。

虽然数组的名称与指向其第一个元素的指针相同,但这是一种“骗子”。将数组传递给函数不会也无法传达数组的长度。要做到这一点,你需要一个包含长度的第二个参数,或者像字符串上的nul-terminator这样的约定来指示数组的结尾。通过该更改,您可以修改myFunc()以对传递的元素使用循环并打印每个元素。

答案 5 :(得分:1)

你的代码中的问题是你想要打印一个字符串(char *),但你给它一个字符。请记住,P是char *的数组。当你取消引用它一次,你得到一个char *;当你第二次这样做时,你只需要在char *的开头得到char。

当您尝试将char值与%s说明符一起使用时,它会将该值视为指针,并尝试取消引用该值。因此,它将尝试在存储器位置X处打印“字符串”,其中X是字符的值(即,从0到255的值)。这会给您一个访问冲突/分段错误(您在运行时看到的错误)。

Cătălin PitișRBerteig指出的最佳解决方法是:

  • 传递另一个参数以指定数组的长度
  • 在数组末尾添加一个额外的null。

答案 6 :(得分:1)

如果您不想保留并传递数组大小::

int myFunc(char **);
main()
{
    char *a[2]={"Do","While", NULL};
    myFunc(a);
}

int myFunc(char **P)
{
    if( !P )
        return 0;
    while(*P != NULL)
    {
        printf("%s",*P);
        P++;
    }
}

答案 7 :(得分:0)

错误答案:我认为你打印它时可能不得不取消引用,尽管我可能错了。

编辑:我很累,现在凌晨3点,但我不想睡觉,所以我在这里试图回答问题。在阅读批评之后,我重新阅读了这个问题,并注意到他确实取消了P,但正如另一个答案所述,它被解除引用太多了。当想要打印char字符串时,想要传递指针,因为char字符串实际上是一个数组。

另一个编辑:我还想指出,在我回答后,提出问题的人进行了编辑,当我第一次回答它时,没有读到“printf(”%s“,** P); “它读作“printf(”%s“,P);”最后一部分是大胆的。