在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
任何帮助将不胜感激。提前谢谢。
答案 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;
}