[英]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.