我已经阅读了几篇关于在C语言中传递char *的讨论。
stackoverflow: 在C中将字符串数组作为参数传递给函数
stackoverflow: 指向指针数组的数组是如何工作的
stackoverflow: 你最讨厌程序员无知的事情是什么
drexel.edu: 字符数组
其中很多都涉及到数组的讨论,但我想避开这个话题。
我正在编写一个示例程序,以便学习在C语言中传递
你也可以在github上查看同样的代码 上面的代码有一定自解释性。
每个
但是,当
我可以看到,如果我在发送参数时取消引用指针(
我希望得到一个成功的答案,解释如何将char *作为参数发送和作为函数返回值接收的概念化方式。
我正在编写一个示例程序,以便学习在C语言中传递
char *
和char **
。这是一个关于传递char *的练习,不使用(指向)数组。同时无需考虑执行效率。 :-)#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void get_args_works(int, char **, char **);
void get_args_broken(int, char **, char *);
char *get_string(int, char **);
int main(int argc, char **argv)
{
char *string_works;
char *string_broken;
get_args_works(argc, argv, &string_works);
get_args_broken(argc, argv, string_broken);
printf("in main string_works (%p) = %s\n",string_works,string_works);
free(string_works);
printf("in main string_broken (%p) = %s\n",string_broken,string_broken);
free(string_broken);
}
void get_args_works(int argc, char **argv, char **string)
{
*string = get_string(argc, argv);
printf("in get_args_works %p string %s\n",*string,*string);
}
void get_args_broken(int argc, char **argv, char *string)
{
string = get_string(argc, argv);
printf("in get_args_broken %p string %s\n",string,string);
}
char * get_string(int argc, char **argv)
{
int i;
char *string;
string = malloc(40);
// placeholder in case -s switch not found below
strcpy(string,"-s switch not found below");
for(i = 0; i < argc; i++)
{
if(argv[i][0] == '-')
{
switch(argv[i][1])
{
case 's':
// release above malloc(40) for "-s switch not found below"
free(string);
// make room for storing variable
string = malloc(strlen(argv[++i]) + 1);
// the argv just after -s
strcpy (string,argv[i]);
break;
}
}
}
return string;
}
你也可以在github上查看同样的代码 上面的代码有一定自解释性。
main()
声明了两个char *变量,并将它们作为参数传递给各自的get_args()
函数。每个
get_args()
函数调用char * get_string(int, char **)
,使用完全相同的调用(但不同的收集返回值的方法)。
get_string()
运行良好;它执行malloc()
并将指针返回到调用函数。这段代码运行良好,每个get_args()
函数都按我预期接收返回值。但是,当
get_args()
函数返回到main()
时,为什么指针的解除引用值从get_args_works()
返回到主函数,但指针的值从get_args_broken()
中并没有返回?我可以看到,如果我在发送参数时取消引用指针(
&string_works
),它就会起作用。 但是为什么?char * string_broken
不已经是一个指针了吗?为什么在发送参数时需要“额外”的取消引用呢?我希望得到一个成功的答案,解释如何将char *作为参数发送和作为函数返回值接收的概念化方式。