将变量x初始化为char**与将变量x初始化为char*然后使用&引用它之间有什么区别?这个问题是由下列问题提出的:
我在看男人3号的功能。函数签名是:

long strtol(const char *restrict str, char **restrict endptr, int base);

所以,为了传递endptr变量,我设置了一个变量:
char **endptr;

但是当我将它传递给函数时,它总是返回NULL,即使str传递给strtol的情况类似于abc。即:
         char ** endptr;
         long exitval = strtol(args[1], endptr, 10); /* try to get the val */
         if (endptr != NULL) { /* it wasn't a valid base-10 number */

但当我将endptr初始化为:
char *endptr;

然后将endptr作为&endptr传递给函数,endptr设置正确。即:
         char * endptr;
         long exitval = strtol(args[1], &endptr, 10); /* try to get the val */
         if (endptr != NULL) { /* it wasn't a valid base-10 number */

在这两种情况下,我认为我传递的是指向char数组中第一个char的指针的a指针,但是一个方法有效,另一个方法不表示我的理解不正确。
为什么一种方法有效而另一种方法无效?我误解了什么?

最佳答案

我要试一试。
函数strtol需要它可以写入的内容的地址。
当你申报

char *ptr;

您有一个名为ptr的变量,当您传递其地址时,strtol可以写入该位置,然后您可以通过查看变量的内容来使用该值。
当你申报
char **ptr;

只需传递它的值,首先你可能传递了一个未初始化的值,这个值strtol将试图写入,其次,即使你初始化它,你也只传递它的内容-strtol将修改它指向的位置,而不是变量本身的内容。

08-17 00:23