我有一个功能..
char ** getCommand()
{
char *commandArray[BUFSIZ]; //declaring an array of char pointers
// i m doing things to array
return commandArray;
}
我收到一条错误说“冲突的类型”。 commandArray的类型是什么?它是指向右边的指针吗?
我尝试了char * getcommand()......但是也没用。我在main中调用这个函数 所以我已经开始了..
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;
}
答案 0 :(得分:7)
你有问题。您将数组声明为局部变量 这意味着它将在块的末尾死亡(被释放) 如果你想要返回它,你需要动态分配它(并记得以后释放它)
char** getCommand()
{
char **commandArray = (char **)malloc(BUFSIZ* sizeof(char*));
// i m doing things to array
return commandArray;
}
答案 1 :(得分:2)
问题是commandArray是一个指针数组,存储在getCommand()的堆栈框架中,因此从技术上讲,这是未定义的行为。解决方案是将commandArray更改为char **并使用malloc()来分配整个数组。
答案 2 :(得分:2)
以下是需要进行的两项更改:
不应该返回对局部变量的引用(存储在函数堆栈中),而是从堆中分配内存并返回其引用。
在main中接收指针也应该是char **
char **getCommand(){
char **command = (char **) malloc(N*BUFSIZE);
//Do something to command array
return command;
}
int main(){
char **commands;
commands = getCommand();
}
答案 3 :(得分: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
的返回值
答案 4 :(得分:1)
按照其他人的建议动态分配commandArray是不够的,因为返回的已分配数组包含指向输入数组的指针,输入数组也在堆栈上,因此当函数getCommand()返回时超出范围。
要查看这是否是问题的变化:
char input[BUFSIZ];
要
static char input[BUFSIZ];