我的简单C有点生疏,我现在试图弄清楚为什么第一个有效,第二个没有。
char *returnSomething(void) {
char *s = (char *) malloc(5 + 1);
strcpy(s, "Hello");
return s;
}
void dontReturnSomething(char *dest) {
char *s = (char *) malloc (5 + 1);
strcpy(s, "Hello");
dest = malloc(strlen(s) + 1);
strcpy(dest, s);
free(s);
}
int main(int argc, char *argv[]) {
char *first = returnSomething();
char *second = NULL;
dontReturnSomething(second);
printf("first: %s | second: %s", first, second);
}
它基本上做同样的事情吗?
答案 0 :(得分:3)
要通过参数返回指针,您需要一个指向指针的指针。将dest
声明为char **dest
。
void dontReturnSomething(char **dest) {
char *str = "Hello";
*dest = malloc(strlen(str) + 1);
strcpy(*dest, str);
}
像这样调用函数:
dontReturnSomething(&second); // pass in address of second
答案 1 :(得分:1)
为了更准确,只需要指针指针,就像在上面的例子中一样,直到你输入函数之后才会分配内存。只想对任何有指针问题的人说这个,并认为任何指针的传递总是需要指针指向传递。
例如,下面的示例效果很好。
void dontReturnSomething(int* testint)
{
int test = 33;
*testint = test;
}
int main(int argc, char *argv[])
{
int *first = calloc(1,sizeof(int));
printf("Before: %d\n", *first);
dontReturnSomething(first);
printf("After: %d\n", *first);
return(1);
}
如果你运行它,你将按预期得到0和33。当然,需要注意的是,您必须将内存分配给正在使用的指针。如果为函数内部的指针分配了内存,那么您将为其分配一个新地址,然后必须返回该地址以便该地址可以保留。以下示例也可以正常使用。
void dontReturnSomething(char* testchar)
{
char* test = "Hello World!";
strcpy(testchar,test);
}
int main(int argc, char *argv[])
{
char *hello = NULL;
hello = calloc(13, sizeof(char));
printf("Before: %s\n", hello);
dontReturnSomething(hello);
printf("After: %s\n", hello);
return(1);
}
当然,你几乎不会提前知道字符串的大小,或者更常见的是缓冲区。我认为了解指针的微妙之处非常重要。