我有这个代码,函数strtol接收一个双指针,并假设字符串“prueba”是指向字符串的第一个元素的内存地址的指针(这是整个链的相同内存地址) ),那就好像它正在传递一个指针的目录,我不知道我是否解释,无论如何它不起作用:/在这里发出警告
ret = strtol(str, &prueba, 10);
long int strtol(const char * str,char ** endptr,int base)strtol根据给定的base将str中字符串的初始部分转换为long int值 . “endptr”his是对char *类型对象的引用,其值由函数设置为数值后的str中的下一个字符 .
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str[30] = "2030300 This is test";
char prueba[20];
char *ptr;
long ret;
printf("\nLa cadena inicial es: %c%s%c\n",34,str,34);
ret = strtol(str, &ptr, 10);
printf("\nThe number(unsigned long integer) is %ld\n", ret);
printf("String part is |%s|\n", ptr);
ret = strtol(str, &prueba, 10);
printf("\nProbando: %c%s%c\n",34,prueba,34);
return(0);
1 回答
我认为这里有一个很大的误解需要解决: Pointers are not the same as arrays . 指针是告诉你如何找到其他东西的东西;其他东西可能是单一的东西,或足够的未初始化的空间来容纳一个东西,或一堆它们在一个块中 . 数组是一个事物块,非常具体地说不是指向一块事物的指针 . 您可以在每次之后放置
[0]
并最终得到一个与此讨论无关的内容 .为什么它不会衰变成代表其第一个元素的地址的
char *
,就像传递给函数甚至分配的那样?因为C标准说它不会 - 它正确定义了"arrays decay into pointers to their first element"规则的三个例外 . 其中一个是当该数组是&
运算符的操作数时,所以你得到一个指向那个东西的指针.745565_t那个东西 .因此,你没有将
char **
传递给strtol
. 你're passing a pointer to an array. While that might be OK in some cases, it'不在这里,因为函数想要把char *
放在你告诉它放一个的地方;如果你试着说“把它放在这个char[]
”,它会's not going to do what you want. It' ll尝试将char *
填入你的char[]
,你会得到未定义的行为 .有关进一步阅读,请参阅comp.lang.c常见问题解答6.2和6.3 .
哦,顺便说一句,如果你告诉它,GCC会警告你:传递
-Wincompatible-pointer-types
或者更好的是,像-Wall -Werror
(取决于你的编译器's recommendation), to the compiler -- it' ll会产生一个大致如下的警告:当然,确切的文字可能有所不同,但它的要点是相同的 .