如何通过函数设置指针引用

时间:2010-08-19 21:43:34

标签: c

在C中,我试图通过将其发送到函数来设置指针的值,但该值不会在函数外部发生变化。这是我的代码:

#include <stdio.h>
void foo(char* str) {

    char* new_str = malloc(100);
    memset(new_str, 0, 100);
    strcpy(new_str, (char*)"new test");

    str = new_str;
}


int main (int argc, char *argv[]) {

    char* str = malloc(100);
    memset(str, 0, 100);

    strcpy(str, (char*)"test");

    foo(str);

    printf("str = %s\n", str);
}  

我想打印出来:

str = new test 

但是这段代码打印出来:

str = test

任何帮助将不胜感激。提前谢谢。

4 个答案:

答案 0 :(得分:21)

C中没有传递引用。如果您将str作为C中函数的参数,则始终传递str的当前值,而不是{{1}本身。

您可以将指针传递给str进入函数:

str

正如Eiko所说,你的示例代码泄漏了第一个内存分配。你不再使用它了,你不再有指针,所以你不能释放它。这很糟糕。

答案 1 :(得分:3)

您需要使用指针指向未经测试的指针:

#include <stdio.h>

void foo(char** str)
{
    char* new_str = malloc(100);
    memset(new_str, 0, 100);
    strcpy(new_str, (char*)"new test");
    if (str) { /* if pointer to pointer is valid then */
        if (*str)   /* if there is a previous string, free it */
            free(*str);
        *str = new_str;  /* return the string */
    }
}


int main (int argc, char *argv[])
{
    char* str = malloc(100);
    memset(str, 0, 100);

    strcpy(str, (char*)"test");

    foo(&str);

    printf("str = %s\n", str);
}

答案 2 :(得分:2)

你只是重新分配一个指针,它是foo中的一个局部变量。

如果要复制字符串,请使用strcpy(str, new_str);

您可以将引用传递给指针并重新分配,但这很容易导致内存泄漏并且难以维护。

编辑:对于伪传递,请参阅Steve的答案。

答案 3 :(得分:1)

我是通过从函数返回指针来这样做的。在这种情况下没有理由使用malloc,因此您不必担心释放。

gcc 4.4.3 c89

char* print_test(char *str)
{
    char *new_str =  "new_test";
    printf("new_str [ %s ]\n", new_str);
    str = new_str;
    return str;
}

int main(void)
{
    char *str = "test";

    printf("str [ %s ]\n", str);

    str = print_test(str);

    printf("str [ %s ]\n", str);

    return 0;
}