如何将指针指针传递给函数?

时间:2013-07-12 01:46:38

标签: c

我知道如何修改main中的指针数组,但是当我的函数需要修改它时,不知道该怎么做。 **之间的代码是我在不使用函数的情况下在main中执行的操作。我知道如何打印出指针指针数组。我的问题是,假设我想将这些行**移动到function()中,我需要修改什么?

代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void function(char *array[], int size);
void function_print(char *array[], int size);
int main()
{
    char *array[] = {0};

    char word[20];

    **scanf("%s", word);
    int len = strlen(word) + 1;
    array[size] = (char *)malloc(sizeof(len));          
    strlcpy(array[size], word, sizeof(array[size]));**


    function(array, 0);

    return 0;
}

void function(char *array[], int size)
{

}

void function_print(char *array[], int size)
{
   for(int x = 0; x < size; x ++)
   {
       printf("%s", *array);
       (array)++;
   }
}


~
~

4 个答案:

答案 0 :(得分:1)

我做了一些编辑,并意识到你的功能也会这样做。所以继续,如果你不知道它是如何工作的,请阅读编辑

此外,我认为你的主()中出现了问题。首先,array [size] =(char *)malloc(sizeof(len));往往会报告错误,因为此处未定义大小。其次,如果按大小表示数组中元素的数量,则array [size]会导致溢出。第三,malloc的参数应该是sizeof(char)* len,而不是sizeof(len),因为后者等于sizeof(int)。

将您的功能更改为

void function(char **, int);

并通过

调用它
function(array, 0);

修改

我认为通过“修改它”你的意思是改变存储在数组中的指针。由于每个元素都是char*,因此char**将完成这项工作。

当您将array作为参数传递时,实际上您传递的是第一个元素的地址。然后在函数中使用char** parray接收它。由于您还传递了尺寸,因此可以将其用作char* parray[],并且每个元素的地址与array中的main()完全相同。因此,使用parray进行的任何修改都会更改array。这就是你想要的吗?

答案 1 :(得分:0)

在调用函数并传递char指针数组时,你没有错。这是一种正确的方法。你的程序没有为我编译,所以做了一些小改动。它有效。

    #include<stdio.h>
    #include<string.h>
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<iostream>

    void function(char *array[], int size);
    int main()
    {
        char *array[] = {0};
        char word[20];
        scanf("%s", word);
        int len = strlen(word) + 1;
        array[0] = (char *)malloc(sizeof(len));          //that how I do it in main without using a function.
        strcpy(array[0], word);


        function(array, 0);

        return 0;
    }

    void function(char *array[], int size)
    {
        char * temp =  new char[strlen(array[0])+1];
        strcpy(temp, array[0]);
        printf(temp, 's');

    }

答案 2 :(得分:0)

写这个:

void function(char *array[], int size)

和此:

void function(char **array, int size)

在这种情况下,

是相同的。

如果你定义一个这样的函数,那么就没有必要声明它,就像声明它一样: void function(char **, int );

声明仅描述函数的返回类型和参数类型。现在,还有其他一些建议:

请勿使用 scanf

scanf("%s", word);// you need to specify field width in case of strings otherwise it will overwrite buffer in case of large strings因此,请这样做:

scanf("%19s",word);

size未在您的主要内容中定义,而是我更愿意这样做:

size_t len = sizeof(word) + 1;// yes, try to use size_t when returning number of bytes 
    *array = (char*)malloc(sizeof len);// casting malloc is not recommended though. 
    strncpy(*array, word,len);

答案 3 :(得分:-2)

尝试做:

void function(char *array, int size)();

而不是:

function(array,0);

因为数组本身是一个记忆地址。