我找到了使用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
中未初始化指针的使用是否正确?如果是这样,为什么不能正确使用未初始化的指针呢?
答案 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中最后一位数字后面的字符的地址。