strcpy与目标指针和返回值

时间:2014-04-23 22:21:09

标签: c

我的简单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);
}

它基本上做同样的事情吗?

2 个答案:

答案 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);
}

当然,你几乎不会提前知道字符串的大小,或者更常见的是缓冲区。我认为了解指针的微妙之处非常重要。