这个strtol示例在处理未初始化指针时是否正确?

时间:2017-10-25 03:37:08

标签: c

我找到了使用strtol而不是here的示例 - 我将在此处复制示例:

#include <stdio.h>
#include <stdlib.h>

int main () {
   char str[30] = "2030300 This is test";
   char *ptr;
   long ret;

   ret = strtol(str, &ptr, 10);
   printf("The number(unsigned long integer) is %ld\n", ret);
   printf("String part is |%s|", ptr);

   return(0);
}

char *ptr中未初始化指针的使用是否正确?如果是这样,为什么不能正确使用未初始化的指针呢?

3 个答案:

答案 0 :(得分:5)

你实际上并没有使用未初始化的指针。您传递的是已知的局部变量的地址。

变量ptr的类型为char *,因此&ptr的类型为char **,这是strtol对其第二个参数的预期。然后,strtol函数将取消引用此指针,从而产生类型为char *的左值表达式(即您可以指定的表达式),以将地址分配给ptr

答案 1 :(得分:1)

来自man strtol我们得到了这个

  

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

     

如果endptr不为NULL,则strtol()将第一个无效字符的地址存储在* endptr中。如果有的话          没有数字,strtol()将nptr的原始值存储在* endptr中(并返回0)。特别是,如果          * nptr不是&#39; \ 0&#39;但是** endptr是&#39; \ 0&#39;返回时,整个字符串都有效。

在你的情况下,你没有传递一个NULL指针,因为&ptr不是NULL,所以万一你的输入字符串都不会被解析,在strtol完成后,它会改变指针{ {1}}指向输入字符串中的某个位置,其中没有其他位数。

例如,如果要从字符串ptr中提取长数字,此调用将返回等于123abc的长数,并且ptr将变为指向字母123的字符串

答案 2 :(得分:0)

您可以将此实例中的ptr视为out参数。您在堆栈中传入ptr变量的有效地址,然后函数将写入(输出)str中最后一位数字后面的字符的地址。