当前位置: 首页 > 知识库问答 >
问题:

为什么我不能传递链的地址?斯特尔托尔

谷梁鸣
2023-03-14

我有这段代码,函数strtol接收一个双指针,并且假设字符串“prueba”是一个指向字符串第一个元素的内存地址的指针(与整个链的内存地址相同),那么就好像是在传递一个指针的dir,不知道我解释了没有,反正不起作用:/在这里给出了警告

ret = strtol(str, &prueba, 10);

长int strtol(常量char*str,char**endptr,int base)

strtol根据给定的基将字符串在str中的初始部分转换为一个长的int值。“EndPtr”his是对char*类型对象的引用,该函数将其值设置为字符串中数值之后的下一个字符。

#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个答案

贾成天
2023-03-14

我在这里看到了一个需要解决的重大误解:指针与数组不同。指针是一个告诉你如何找到其他东西的东西;其他的东西可以是一个东西,也可以是足够的未初始化空间来容纳一个东西,或者是一个块中的一堆东西。数组是一组东西,特别是不是指向一组东西的指针。您可以在每个后面加上[0]并最终得到一个东西,这与本讨论无关。

为什么它不变成一个char*来表示它的第一个元素的地址,就像它被传递给一个函数或者甚至被赋值一样?因为C标准说它不会--它精确地定义了“数组衰减为指向其第一个元素的指针”规则的三个例外。其中之一是,当该数组是&运算符的操作数时,这样您就得到了一个指向您所询问的事物的指针,而不是其他尽管相关但不是该事物的事物。

因此,您不会将字符**传递到strtol中。您正在传递一个指向数组的指针。虽然在某些情况下这可能是可以的,但它不在这里,因为函数希望在您要它放一个字符*的地方放一个;如果您试图说“把它放在这个char[]中”,它将不会达到您想要的效果。它将尝试将char*填充到char[]中,您将得到未定义的行为。

有关进一步阅读,请参阅Comp.lang.c常见问题解答问题6.2和6.3。

哦,顺便说一句,如果您告诉GCC:将-wincompatible-pointer-types或者更好的是,将-wall-werror之类的东西(取决于编译器的建议)传递给编译器,它将生成一个大致如下所示的警告:

/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));

当然,确切的文本可能有所不同,但其要旨是相同的。

 类似资料:
  • 我正在使用Springboot和Java8 我有以下url,它与邮递员配合得很好: "http://localhost:8888/gc/goods/getAll" 现在我尝试编写一个自动测试: 当邮递员给我所有的数据回来,我得到以下错误从我的测试: 组织。springframework。网状物客户ResourceAccessException:获取请求“”时发生I/O错误http://localh

  • 问题内容: 当我看到以下代码无法按预期工作时,我有些困惑。 我认为Java总是通过引用将变量传递给函数。因此,为什么函数不能重新分配变量? 该程序输出。 问题答案: 对对象的引用是通过Java中的 值 传递的,因此在方法内部分配给局部变量不会更改原始变量。仅局部变量指向新字符串。稍微了解一下ASCII艺术可能会更容易理解。 最初,您有: 首次输入方法setNotNull时,您 将在中 获得null

  • Scala开发人员学习IO单元体,因此一般的蹦床技术对于不可能进行尾调用优化的递归是必要的,我想知道Haskell是如何避免它的。 我知道Haskell是一种懒惰的语言,但是我想知道是否有人可以再详细说明一下。 例如,为什么ForeverM stackoverflow不在Scala中运行?好吧,我可以回答蹦床,我可以找到实际的代码,在图书馆和博客。我自己居然实现了一个基本的蹦床来学习。 在哈斯克尔

  • 问题内容: 即使我已应用propType验证,但在传递prop的布尔值时,我的编辑器也会引发错误。这是我所看到的: 错误:“ SyntaxError:JSX值应为表达式或带引号的JSX文本” 我知道我正在为’hasvacancy’属性传递一个字符串类型的值,但是我需要做些什么,这样我就可以通过该属性传递一个布尔值或其他数据类型。 问题答案: 您应将布尔值括在{}中:

  • 问题内容: 我有以下定义: 我尝试按如下方式调用它,但收到错误消息: 这符合: 问题答案: 该相关转到FAQ中指出,和«别在内存相同的表示»。 要了解原因,让我们剖析两件事: 切片是一个后备存储阵列,外加几个包含切片大小和容量的整数。 在Go中,数组并不是某种意义上的“高级”。相反,它们包含的元素的布局是严格定义的:它们全部包含在内存的相邻区域中,彼此相邻。 这意味着,在切片的支持数组中,元素是类

  • 问题内容: 我以为Python信任程序员。 问题答案: 圭多对此的看法: 我昨晚想到了这一点,意识到根本不应该允许您继承bool!子类仅在具有实例时才有用,但是仅存在bool子类的实例将打破不变的事实,即True和False是bool的唯一实例!(C的子类的实例也是C的实例。)我认为重要的是不要提供后门来创建其他bool实例,因此我认为bool不应是子类的。 参考: http //mail.pyt