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

使用带有浮动指针的printf会出错

方博
2023-03-14

当我尝试编译此代码时:

void main()
{
float x;
    x=6.5;
    printf("Value of x is %f, address of x %ld\n", x, &x);
}

它给了我这个错误:

pruebaso. c:在函数'main'中:

pruebaso.c:5:9:警告:内置函数“printf”的隐式声明不兼容 [默认启用]

printf(" x的值是%f,x的地址是%ld\n ",x,

^

pruebaso. c: 5:9:警告:格式'%ld'需要类型为'long int'的参数,但参数3的类型为'浮点数*'[-Wformat=]

我在另一个论坛上看到,解决办法是先对一个空指针进行强制转换:http://www.linuxquestions.org/questions/programming-9/beginning-c-programming-how-to-print-memory-locations-printf-conversion-number-927305/

但是做出这样的改变,

printf("Value of x is %f, address of x %ld\n", (double)x, (void *)&x);

现在给我一个警告:

pruebaso. c:在函数'main'中:

pruebaso.c:5:9:警告:内置函数“printf”的隐式声明不兼容 [默认启用]

printf(" x的值是%f,x的地址是%ld\n ",(double)x,(void *)

^

普鲁巴索。c: 5:9:警告:格式“%ld”需要“long int”类型的参数,但参数3的类型为“void*”[-Wformat=]

有人能告诉我怎么才能在没有得到警告的情况下解决这个问题吗?

非常感谢。

共有3个答案

麻宾白
2023-03-14

如果在定义函数之前使用它们,C会隐式声明函数,这会导致错误“内置函数'printf'的不兼容隐式声明”。若要解决此问题,请添加#include

第二个问题是,您应该使用 %p 来打印指针。

生成的代码是

#include <stdio.h>
int main(void)
{
  float x;
  x=6.5;
  printf("Value of x is %f, address of x %p\n", x, (void *) &x);
  return 0;
}

陈斌蔚
2023-03-14
void main()
{
    float x;
    x=6.5;
    printf("Value of x is %f, address of x %ld\n", x, &x);
}

眼前的问题是您缺少必需的#include

#include <stdio.h>
int main(void)
{
    float x;
    x = 6.5;
    printf("Value of x is %f, address of x %p\n", x, (void*)&x);
}

为了解释我所做的更改:

  • #include

越涵衍
2023-03-14

您需要包含<代码>

在C90中,使用< code>printf()而不使用< code >

#include <stdio.h>
int main(void)
{
    float x = 6.5;
    printf("Value of x is %f, address of x %p\n", x, (void *) &x);
}

< code>%p格式说明符用于打印指针。从技术上讲,它必须与< code>char *或< code>void *指针一起使用。在现代系统中,这不会影响结果;但是将其他指针类型传递给< code>%p在技术上会调用未定义的行为(这是不好的)。

您的代码中的< code>%ld格式是错误的,尽管它可以在大多数系统上工作。首先,它需要一个< code>long参数,这需要强制转换(即使这种转换只会对少数系统产生影响)。其次,即使添加了强制转换,也不能保证指针中的所有信息都保留下来(它可能会删除一些位或做其他事情)。实际上,64位Windows系统是唯一一个转换为< code>long位的系统,这种转换在其他任何地方都可以正常工作。

所以使用< code>%p并强制转换为< code>void *。

 类似资料:
  • 我的愿望是当屏幕尺寸减小时,上会出现溢出滚动条。 它在Firefox上是这样做的,然而,背景并没有覆盖滚动条右侧的内容。 此外,IE和Chrome都向下推,甚至不显示滚动条。 编辑下面的图片显示了我想要的外观。请注意,有一个滚动条。 https://output.jsbin.com/huwagajome

  • 我使用这个代码: 定义: 我用命令构建它:,结果是: 警告:在“void*memcpy(void*,const void*,size_t)”调用中“大小”的参数与目标的指针类型“双*”相同;预期的“双倍”或显式长度 [-Wsizeof-指针-内存] 我不明白它是什么。你能告诉我如何使它正确工作吗?

  • 我试图用Powermock和Mockito编写一个JUnit测试用例。我正在从测试用例下面调用一个方法。此方法从method1调用,而该方法调用Method2。我已经添加了@runwith和@preparefortest注释。 //这是我的测试类: 错误跟踪:

  • 我使用了页面对象模型设计模式和Cucumber。为此,我创建了两个名为和的页面,但在运行脚本时,即使我已经使用pagefactory初始化webelements,也会出现空指针异常,请查看以下代码: 文摘: 登录页面: 然后我有一个类,在这里我调用上面的登录类方法。浏览器打开良好,url被命中,但当它进入l方法时,它会在第一行本身抛出异常。 我还有一个TestRunner类,其中我粘贴了我的步骤定

  • 问题内容: 确实为此感到挣扎-尝试了我能想到的所有方法。希望有人可以提供帮助。 我有一条指令可以为我创建自定义控件的轮廓。定制控件的中心部分将由另一个动态生成的指令表示,该指令基于外部指令上的作用域变量的值。作用域变量包含内部指令的名称。我这样做是因为我的页面将包含多个动态生成的元素,这些元素均具有相同的布局,但内部内容不同。 即我的外部指令的示例: 设置为另一个指令的名称-在这种情况下。因此,我

  • 问题内容: 我尝试从我的汇编代码中使用,这是一个最小示例,应仅打印到stdout: 我用 当我运行它时,它似乎可以正常工作:该字符串已打印出来,退出状态为: 但是当我尝试捕获文本时,很明显,某些功能无法正常工作: 该变量应具有值,但为空。 我的用法有什么问题? 问题答案: 使用 诸如printf之类的stdio函数后,请使用而不是原始syscall。 正如Michael解释的那样,可以动态链接C库