我原来的问题是我想编写一个可以返回两个值的函数。我知道我可以通过将两个参数的地址传递给函数来直接计算它们在函数中的值。但是在做实验时,会发生一些奇怪的事情。我在函数中得到的值无法生存到主函数中:
#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);
}
上面的程序只打印出一些垃圾。所以我想知道这里有什么问题。最终,我想要这样的parse(char **argv, char **cmd1, char **cmd2)
,它可以从原始命令argv中解析出两个命令。如果有人能解释一下,这将是很好的。非常感谢。
答案 0 :(得分:5)
build()
按指针ch
取值,即将指针的副本传递给函数。因此,当函数退出时,您对该值所做的任何修改都将丢失。由于您希望对指针的修改在调用者的上下文中可见,因此需要将指针传递给指针。
void build(char **ch){
*ch = malloc(30*sizeof(char));
strcpy(*ch, "I am a good guy");
}
此外,您不需要将指针传递给函数,因为您需要返回多个值。另一种选择是创建一个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
}
答案 1 :(得分:1)
如果你想在函数内部使用malloc,你需要将地址传递给外部指针,因为函数内的ch
只是一个局部变量,而改变它不会影响外部{{1}变量
cm
但最好不要在函数内部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);
}
,而只是将你想要的内容写入指针指向的区域。当你需要提供缓冲区来获取C中的数据时,这是常见的方式。通过这种方式,用户可以选择自己分配内存,或者只使用本地缓冲区,之后不需要释放内存在你的例子中忘记了
malloc
答案 2 :(得分:0)
这是因为在C中,你不能重新指定指针的内存地址,因为它是按值传递的。
如果你真的想这样做,你必须将指针的地址传递给构建函数。