Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 返回指针数组,返回类型?_C_Arrays_Pointers_Char - Fatal编程技术网

C 返回指针数组,返回类型?

C 返回指针数组,返回类型?,c,arrays,pointers,char,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()…但也不起作用。我主要调用这个函数 所以我

我有一个功能

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

    return commandArray;
}
我在说“冲突类型”时出错。commandArray的类型是什么?它是指向指针的指针,对吗

我尝试了char*getcommand()…但也不起作用。我主要调用这个函数 所以我一直很在乎

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;
}

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

您遇到了一个问题。您正在将数组声明为局部变量。
这意味着它将在块的末尾消亡(重新释放)。
如果您想要返回它,您需要动态地分配它(记住以后释放它)


以下是所需的两项更改:

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

  • main中的接收指针也应为char类型**


你有一个指向指针的指针。但指针没有有效值。使用
malloc
为几个指针保留一些空间,并将该值分配给指针

cmdArray = malloc(20 * sizeof (char*));
现在,
cmdArray
指向20个指针的区域。但这20个指针都没有有效值。您需要为这20个指针中的每一个分配空间

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

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

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

要查看这是否是问题所在,请执行以下更改:

char input[BUFSIZ];


请发布一个简单完整的示例,演示问题、整个问题以及问题本身。你可以试着将你的修订作为对其中一个答案的评论——什么不起作用?@Chris:问题现在已经解决了。谢谢。commandArray指向的输入数组也在堆栈上。Noob问题:从技术上讲,这仍然是一个数组吗?我一直在互联网上发现,这些指针在技术上不是数组。@weberc2:它不是数组类型。数组类型如下所示:
type variablename[N]。。但是,C++允许你在指针上使用[]操作符,它只使用指针算术来移动内存,就像它是数组一样。因此,如果您查看类型,它是指针类型,而不是数组(对于类型安全性来说,这是一个重要的事实)。但对于任何其他用途来说,它都像一个数组。最好的答案是,他们实际上提到了
免费
,您必须使用它,否则将泄漏内存。
cmdArray = malloc(20 * sizeof (char*));
for (k = 0; k < 20; k++) {
    cmdArray[k] = malloc(BUFSIZ);
}
for (k = 0; k < 20; k++) {
    free(cmdArray[k]);
}
free(cmdArray);
char input[BUFSIZ];
static char input[BUFSIZ];