指向函数中的字符串
它似乎我坚持一些基本知识。 有人可以解释为什么下一个代码:
#include <stdlib.h> void Test1(char *t) { t = (char *)malloc(11); strcpy(t, "1234567890"); } void Test2(char **t) { *t = (char *)malloc(11); strcpy(*t, "1234567890"); } void Test3(char *t) { strcpy(t, "1234567890"); } char * Test4(char *t) { t = (char *)malloc(11); strcpy(t, "1234567890"); return t; } int main() { char *t1 = NULL; Test1(t1); printf("nTest1: %sn", t1); char *t2 = NULL; Test2(&t2); printf("nTest2: %sn", t2); char *t3 = (char *)malloc(11); Test3(t3); printf("nTest3: %sn", t3); char *t4 = NULL; t4 = Test4(t4); printf("nTest4: %sn", t4); return 0; }
给出这个输出:
Test1: (null) Test2: 1234567890 Test3: 1234567890 Test4: 1234567890
Test1功能有什么问题? 为什么Test4与Test1几乎相似? 更一般的问题:在函数中创建字符串并返回指向它的指针的正确方法是什么?
考虑你的Test1执行以下行为:
char * x1 = NULL;
Test1 (x1);
Test1在以下内容中完成:
void test1 (char * t) / / t -> x1 -> null
{
t = (char *) malloc (11);
// t now points a different place (the memory allocated), and the reference of x1 continues pointing to null
strcpy (t, "1234567890"); // t value is "1234567890" but x1 continues pointing to null
// Error, the memory that is pointed by t is never released
}
printf ("nTest1:%s n", t1); / / Print the value of x1 (null) and the reference of t is lost
函数参数不符合您的想法。 你通过“值”而不是“参考”来传递值,这意味着一旦进入函数内部,对这些值的任何改变都仅局限于该函数,所以当函数退出时,局部改变被抛弃。
要解决这个问题,要么传入指针(char ** t)的指针,要么通过引用(char&*)传递指针并更改函数代码以匹配。
你已经将t1定义为char* t1 = NULL;
并将该函数调用为Test1(t1);
传递指针变量t1(不是它的地址)。
函数Test1期待char * void Test1(char *t)
这里t
是仅用于Test1
函数的局部变量。 在函数内部进行的任何修改都不会在函数的外侧显示,因为实际上并未修改main
函数的变量t1
而是局部变量t
。