【发布时间】:2010-11-22 06:36:59
【问题描述】:
我已经阅读了几个关于在 C 中传递 char * 的讨论。
stackoverflow: passing-an-array-of-strings-as-parameter-to-a-function-in-c
stackoverflow: how-does-an-array-of-pointers-to-pointers-work
stackoverflow: whats-your-favorite-programmer-ignorance-pet-peeve
drexel.edu: Character arrays
其中许多都包含数组的讨论,但我想远离它。
我正在编写一个示例程序来教自己如何在 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;
}
您也可以查看same code on github
上面的代码有点自我记录。 main() 声明了两个 char * 变量,并将它们作为参数传递给各自的 get_args() 函数。
每个get_args() 函数调用char * get_string(int, char **),使用完全相同的调用(但收集返回值的方式不同)。
get_string() 工作正常;它执行malloc() 并将指针返回给调用函数。该代码有效,每个get_args() 函数都按我的预期接收返回值。
但是,当 get_args() 函数返回到 main() 时,为什么取消引用的指针值返回到 main(来自 get_args_works(),而不是指针的值(来自 get_args_broken())?
(即我可以看到,如果我在作为参数发送时取消引用指针(&string_works),它可以工作。但是为什么?char * string_broken 不是已经是指针了吗?为什么它需要“额外”取消引用作为参数发送时?)
我希望得到一个成功的答案,解释您(是的,您)如何将 char * 作为参数发送与将其作为函数的返回值接收。
【问题讨论】:
标签: c char parameter-passing