如果我使用while循环遍历指向数组的指针的内容,我该如何返回到数组中的第一个元素?

时间:2016-01-09 23:30:06

标签: c pointers

比如说我有一个从main调用的函数,它返回一个指针:

修改 :我有点不清楚,对不起!让我们说我在main()中使用了scanf然后将其传递给函数,我想将参数复制到一个新指针然后返回那个。

main(void)
{
   char *word = malloc(50);

   scanf("%s", word);

   printf("%s", function(word));
}

char *function(char *array)
{
    char *a = malloc(50);
    while (*array)
    {
        *a = *array;
        a++;
        array++;
    }
return a;
}

在这种情况下,如果我尝试将指针数组返回到main,则指针将指向超出我的值所在位置的内存位置。

我怎样才能这样做,我可以再次将指针返回第一个值?

谢谢!

3 个答案:

答案 0 :(得分:3)

最好的方法是不要增加你的指针:

char *function(char *array)
{
    const size_t maxLength = 49;

    char * a = malloc(maxLength + 1);
    if ( !a ) {
        perror("couldn't allocate memory");
        exit(EXIT_FAILURE);
    }

    size_t i;
    for ( i = 0; array[i] && i < maxLength; ++i ) {
        a[i] = array[i];
    }
    a[i] = '\0';

    return a;
}

您的原始代码未终止a,但您将其传递给printf(),就好像它是一个字符串一样。此外,您还会泄漏记忆,因为您不会存储您要返回的指针,因此您永远不能free()它。

答案 1 :(得分:1)

基本方法是使用临时变量来保存您想要保留的指针值。

假设您的示例中唯一关注的是a

char *function(char *array)
{
    char *a, *t;
    t = a = malloc(50);
    while (*array)
    {
         *t = *array;
         ++t;
         ++array;
    }
    *t = '\0';   /* since the caller passes returned pointer to printf() */

    return a;    /*  a unchanged, so return it */
}

请注意,如果strlen(array) >= 50,则上述内容将具有未定义的行为。

在您的示例中,array按值传递,因此对其的更改(重复递增)不会传播给调用者 - 无需将array重置为其原始值。< / p>

答案 2 :(得分:0)

最好的方法是不要在函数中使用参数,而是在函数内部复制它。

char* pTmp = array;

最好是使用++ pTmp而不是array ++,因为对于非POD类型,它可以更快。