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