3
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”函数时必须使用&-操作数,并且不能将enter_path定义为“int enter_path(char* path);”

我知道这是引用数据类型(如 int、long 等)的普通变量,但我认为在使用指针时,更改对其他所有函数都是可见的。导致指针仍然指向内存中的同一点,只是值已更改。

难道我看到这一切都错了吗?

PS:我正在尽我所能保持我的代码符合 ansi-C 标准,这就是我使用 fgets 而不是 readline 的原因。只是说因为我已经收到了一些关于 readline 函数更容易/更安全使用的评论。

亲切的问候, JD

4

3 回答 3

2

如果您有一个类型的变量T希望函数能够修改,则需要通过指针传递它,即:

void foo(T *p) { *p = 42; }

int main(void) {
    T t;
    foo(&t);
    // The value of t is now 42
}

在您的代码中,Tchar *; 换句话说,您的函数需要能够修改指针,因此您需要将指针传递给该指针。


但是,这不是好的代码。如果(**path == '\n')是真的,那么你将泄漏内存。

于 2012-06-16T11:52:37.197 回答
1

原因是如果你将参数类型指定为char *,你会在函数中对指针的副本进行操作,所以你的代码(针对这个场景修改)

path = strdup(standard);

函数结束后不会反映在调用者中

通过传递变量的地址,您可以更改指向的指针,即使在函数返回后,这种更改也会持续存在

将指针视为您的数据(就像 withint等一样),通过传递char *指针您可以修改指向的字符;通过传递一个char **指针,您可以修改指向的指针(修改也反映在调用者函数中)。

于 2012-06-16T11:51:30.687 回答
0

您正在传递一个path本身就是指针的变量。但是您正在修改函数中的指针本身enter_path,因此您必须将指针传递给path,因此要传递的地址path是要传递的,因此&path是传递的。

在当前情况下,线路

*path = strdup(standard);

它确实修改了函数中的变量路径,但它的值不会在函数之外改变,即在函数 main 中。

于 2012-06-16T11:58:27.790 回答