2011-06-19 62 views
1

我有一个功能..返回一个指针数组,返回类型?

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

    return commandArray; 
} 

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

我试过char * getcommand()...那也不管用。我打电话主 所以我delcared这个功能..

main() 
{ 
    char *commands; 

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

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

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

回事请告诉我?我从来没有工作过W¯¯指针/阵列之前... 有人简化问题......给我某种暗示PLS的..

编辑建议

好,谢谢...没有工作...

我粘贴的代码...建议的变化反映..getting相同的错误,说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; 
} 
+2

请张贴说明问题,整个问题只是问题的一个最小的,完整的例子。 –

+0

您可能会尝试将您的修订发布为其中一个答案的评论 - 哪些不适用? –

+0

哇!你的死回归! –

回答

2

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

7

您有问题。你将数组声明为局部变量。
这意味着它将在块的末尾死亡(被重新发售)。
如果你想回到它,你需要动态地分配它(记住稍后释放它)

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

    // i m doing things to array 

    return commandArray; 

} 
+0

输入数组 - 哪个commandArray指向 - 也在堆栈上。 – Dipstick

+0

Noob问题:这在技术上仍然是一个数组?我一直在互联网上发现,这些指针并不是技术上的数组。 – weberc2

+1

@ weberc2:它不是数组类型。一个数组类型如下所示:'type variablename [N];'..但是,C++允许您在指针上使用[]运算符,它只是使用指针运算来移动内存,就像它是一个数组一样。所以如果你看看类型,它是一个指针类型,而不是一个数组(对于类型安全来说是重要的事实)。但出于任何其他目的,它就像一个数组。 –

2

以下是这两个变化需要:

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

  • 在主接收指针也应该是char类型的**


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

int main(){ 
    char **commands; 
    commands = getCommand(); 
} 
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返回值

1

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

要看看这是问题的变化:

char input[BUFSIZ]; 

static char input[BUFSIZ];