J F*_*ird 3 c function return-value
我最初的问题是我想编写一个可以返回两个值的函数.我知道我可以通过将两个参数的地址传递给函数来直接计算它们在函数中的值.但是在做实验时,会发生一些奇怪的事情.我在函数内部获得的值无法生存到main函数:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void build(char *ch){
ch = malloc(30*sizeof(char));
strcpy(ch, "I am a good guy");
}
void main(){
char *cm;
build(cm);
printf("%s\n", cm);
}
Run Code Online (Sandbox Code Playgroud)
上面的程序只打印出一些垃圾.所以我想知道这里有什么问题.最终,我想要这样的东西parse(char **argv, char **cmd1, char **cmd2),它可以从原始命令argv解析出两个命令.如果有人能解释一下,这将是很好的.非常感谢.
build()取指针ch由值,即指针的一个拷贝被传递给函数.因此,当函数退出时,您对该值所做的任何修改都将丢失.由于您希望对指针的修改在调用者的上下文中可见,因此需要将指针传递给指针.
void build(char **ch){
*ch = malloc(30*sizeof(char));
strcpy(*ch, "I am a good guy");
}
Run Code Online (Sandbox Code Playgroud)
此外,您不需要将指针传递给函数,因为您需要返回多个值.另一种选择是创建一个struct包含您希望作为成员返回的值,然后返回所述的实例struct.如果值是相关的,我建议使用第一种方法,将它们打包在一起是有意义的.
修复错误后,重新列出了您的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void build(char **ch){
*ch = malloc(30 * sizeof(char));
strcpy(*ch, "I am a good guy");
}
int main() { // main must return int
char *cm;
build(&cm); // pass pointer to pointer
printf("%s\n", cm);
free(cm); // free allocated memory
return 0; // main's return value, not required C99 onward
}
Run Code Online (Sandbox Code Playgroud)