首页 文章

为什么我不能传递链的地址?与strtol

提问于
浏览
3

我有这个代码,函数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 回答

  • 3

    我认为这里有一个很大的误解需要解决: 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.26.3 .


    哦,顺便说一句,如果你告诉它,GCC会警告你:传递 -Wincompatible-pointer-types 或者更好的是,像 -Wall -Werror (取决于你的编译器's recommendation), to the compiler -- it' ll会产生一个大致如下的警告:

    /path/to/main.c: In function 'main':
    /path/to/main.c:17:23: warning: passing argument 2 of 'strtol' from incompatible pointer type [-Wincompatible-pointer-types]
         ret = strtol(str, &prueba, 10);
                           ^
    In file included from /usr/include/stdio.h:29:0,
                     from /path/to/main.c:1:
    /usr/include/stdlib.h:166:6: note: expected 'char ** restrict' but argument is of type 'char (*)[20]'
     long _EXFUN(strtol,(const char *__restrict __n, char **__restrict __end_PTR, int __base));
    

    当然,确切的文字可能有所不同,但它的要点是相同的 .

相关问题