簡體   English   中英

返回一個指針數組,返回類型?

[英]return an array of pointer, return type?

我有一個功能..

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

    return commandArray;
}

我收到一個錯誤說“沖突的類型”。 commandArray的類型是什么? 它指向指針對嗎?

我嘗試了char * getcommand()......也沒用。 我在main中調用這個函數所以我已經delcared ..

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

你有問題。 您將數組聲明為局部變量。
這意味着它將在塊的末尾死亡(被重新發布)。
如果你想要返回它,你需要動態分配它(並記得以后釋放它)

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

    // i m doing things to array

    return commandArray;

}

問題是commandArray是一個指針數組,存儲在getCommand()的堆棧框架中,因此從技術上講,這是未定義的行為。 解決方案是將commandArray更改為char **並使用malloc()分配整個數組。

以下是需要進行的兩項更改:

  • 不應該返回對局部變量的引用(存儲在函數堆棧中),而是從堆中分配內存並返回其引用。

  • 在main中接收指針也應該是char **類型


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

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

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字符串BUFSIZ - 1長度)。

要釋放空間,你需要反過來:首先是20個指針,最后指向指針

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

在使用內存實現之前,不要忘記檢查malloc的返回值

按照其他人的建議動態分配commandArray是不夠的,因為返回的已分配數組包含指向輸入數組的指針,輸入數組也在堆棧上,因此當函數getCommand()返回時超出范圍。

要查看這是否是問題的變化:

char input[BUFSIZ];

static char input[BUFSIZ]; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM