int enter_path(char** path) {
char* standard = "./questions.txt";
printf("\n\t%s\n\t%s",
"Please enter the file location.", "path: ");
fgets(*path, MAX_PATH_LENGTH ,stdin);
*(*path + (strlen(*path)-1) ) = '\0';
if(**path == '\n' )
*path = strdup(standard);
return 0;
}
int main(void){
char* path = malloc(MAX_PATH_LENGTH);
enter_path(&path);
some_other_function_using_the_path_string(path);
}
上面的代码运行正常,我发布此代码的原因如下。
为什么我必须通过指针的地址"路径"对函数enter_path,所以其他一些函数可以使用/读取修改后的值。 简而言之,为什么在调用" enter_path"时必须使用& -operand。函数,并且不能将enter_path定义为" int enter_path(char * path);"
我知道这是引用数据类型的正常变量,如int,long等。 但我假设在使用指针时,每个其他功能都应该可以看到更改。导致指针仍然引用内存中的同一点,只是值已被更改。
难道我看到这一切都错了吗?
PS:我尽力保持我的代码符合ansi-C,这就是我使用fgets而不是readline的原因。只是说因为我已经就readline功能更容易/更安全的事实得到了一些评论。
亲切的问候, JD
答案 0 :(得分:2)
如果你有一个类型T
的变量,你想要一个函数能够修改,你需要通过指针传递它,即:
void foo(T *p) { *p = 42; }
int main(void) {
T t;
foo(&t);
// The value of t is now 42
}
在您的代码中,T
为char *
;换句话说,你的函数需要能够修改指针,所以你需要传递一个指向该指针的指针。
然而,这不是好代码。如果(**path == '\n')
为真,那么你将泄漏内存。
答案 1 :(得分:1)
原因是如果您将参数类型指定为char *
,您将在函数中操作指针的副本,因此您的代码(针对此方案进行了修改)
path = strdup(standard);
在函数结束后不会反映在调用者中
通过passig变量的地址,你可以改变指向指针,即使在函数返回后这个改变仍然存在
将指针视为您的数据(就像使用int
一样),通过传递char *
指针,您可以修改指向的字符;通过传递char **
指针,您可以修改指向指针(修改也反映在调用函数中)。
答案 2 :(得分:0)
您正在传递一个变量path
,它本身就是一个指针。
但是您正在函数enter_path
中修改指针本身,因此您必须将指针传递给path
,因此path
的地址将被传递,因此&path
传递。
在当前场景中,行
*path = strdup(standard);
它确实修改了函数中的变量路径,但它的值不会在函数外部改变,即在函数main中。