返回一个指针数组,返回类型?

时间:2011-06-19 21:14:07

标签: c arrays pointers char

我有一个功能..

char ** getCommand()
{ 
    char *commandArray[BUFSIZ]; //declaring an array of char pointers
    // i m doing things to array

    return commandArray;
}

我收到一条错误说“冲突的类型”。 commandArray的类型是什么?它是指向右边的指针吗?

我尝试了char * getcommand()......但是也没用。我在main中调用这个函数 所以我已经开始了..

main()
{
    char *commands;

    commands = getCommand();  //this didn't work 

    // So I redeclared...
    char *commands[BUFSIZ];

    commands = getCommand();  //this didn't work either.
}

怎么回事?我之前从未使用过指针数组... 有人简化了问题...并给我一些提示......

修改

好的,谢谢你的建议......没有用......

我正在粘贴代码...建议的更改反映..遇到同样的错误,说getCommand有错误的错误类型。

char **getCommand()
{
    int command_num;
    char input[BUFSIZ];
    char **commandArray;

    command_num = 0;
    commandArray = (char**) malloc (BUFSIZ * sizeof(char));

    fgets(input,sizeof(input),stdin);
    commandArray[command_num] = strtok(input, " "); /*breaks a string of commands into
                                                      tokens*/
    while (commandArray[command_num]!= NULL)
    {
        printf ("%s\n", commandArray[command_num]);
        command_num++;
        commandArray[command_num] = strtok (NULL, " ");
    }

    commandArray[command_num] = NULL;  /*very imp - adds null in the last position*/
    return commandArray;
}

5 个答案:

答案 0 :(得分:7)

你有问题。您将数组声明为局部变量 这意味着它将在块的末尾死亡(被释放) 如果你想要返回它,你需要动态分配它(并记得以后释放它)

char** getCommand()
{ 
    char **commandArray = (char **)malloc(BUFSIZ* sizeof(char*));

    // i m doing things to array

    return commandArray;

}

答案 1 :(得分:2)

问题是commandArray是一个指针数组,存储在getCommand()的堆栈框架中,因此从技术上讲,这是未定义的行为。解决方案是将commandArray更改为char **并使用malloc()来分配整个数组。

答案 2 :(得分:2)

以下是需要进行的两项更改:

  • 不应该返回对局部变量的引用(存储在函数堆栈中),而是从堆中分配内存并返回其引用。

  • 在main中接收指针也应该是char **

  • 类型

char **getCommand(){
     char **command = (char **) malloc(N*BUFSIZE);
     //Do something to command array
     return command;
}

int main(){
     char **commands;
     commands = getCommand();
}

答案 3 :(得分:2)

使用

char **cmdArray

你有一个指针指针。但指针没有有效值。使用malloc为一些指针保留一些空间并将该值赋给指针

cmdArray = malloc(20 * sizeof (char*));

现在,cmdArray指向20个指针的区域。但是这20个指针中没有一个具有有效值。你需要为这20个指针中的每一个分配空间

for (k = 0; k < 20; k++) {
    cmdArray[k] = malloc(BUFSIZ);
}

现在,你很高兴去:) cmdArray指向20个有效指针,每个指针指向一个能够保存BUFSIZ字符(或长度不超过BUFSIZ - 1的字符串)的内存区域。

要释放你需要做的反向空间:首先是20个指针,最后是指向指针的指针

for (k = 0; k < 20; k++) {
    free(cmdArray[k]);
}
free(cmdArray);

在使用内存实现之前,不要忘记检查malloc的返回值

答案 4 :(得分:1)

按照其他人的建议动态分配commandArray是不够的,因为返回的已分配数组包含指向输入数组的指针,输入数组也在堆栈上,因此当函数getCommand()返回时超出范围。

要查看这是否是问题的变化:

char input[BUFSIZ];

static char input[BUFSIZ];