将变量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
将修改它指向的位置,而不是变量本身的内容。