gpt4 book ai didi

c - float * 和 int * 的不同 printf 行为?

转载 作者:太空宇宙 更新时间:2023-11-04 05:13:35 25 4
gpt4 key购买 nike

首先,让我澄清一下,我知道将指针作为参数传递给这些 printf 说明符是不正确的。但是,我很想知道 printf 完成后发生了什么。

使用普通 打印说明符,%d 用于int%f 用于float ,为什么int *会打印,而float *不会?

例如,给定这些变量(未初始化):

int a, *pA;
float b, *pB;

pA = &a;
pB = &b;

当这样调用时:

void printVar(int *a, float *b)
{
printf("%d\n", a);//why does "a" print at all?
printf("%d %p\n", a, b);// when "b" prints only using %p
//printf("%d %f", a, b);// but fails on parameter mismatch using %f
printf("%d %f\n" , *a, *b);// prints normally (as expected)
}

为什么我会得到这个?:(“a”打印正常,但“b”仅使用 %p 或传递 *b 打印)

enter image description here

[编辑] 整个代码以澄清和解决一些评论问题:

#include <ansi_c.h>

void printVar(int *a, float *b)
{
printf("%d\n", a);//why does "a" print at all?
printf("%d %p\n", a, b);// when "b" prints only using %p
//printf("%d %f", a, b);// but fails on parameter mismatch using %f
printf("%d %f\n" , *a, *b);// prints normally (as expected)
}

int main()
{
int a, *pA;
float b, *pB;
char s[100], *pS;

pA = &a;
pB = &b;
pS = &s[0];

printVar(pA, pB);

getchar();

return 0;
}

***[edit 2] 如果取消注释 3rd printf,解决一些关于实际内容的注释

我收到以下两个运行时通知,然后第 3 行的 printf 没有输出:
enter image description here
enter image description here

最佳答案

你有这些参数:

int *a, float *b

这个:

printf("%d\n", a);

最有可能处理a占用的内存空间(属于 int* 类型)好像它是 int 类型的对象.在许多系统上,这会给你一个几乎有意义的结果。 (当然,如果你真的想打印一个指针值,你需要将它转换为 void* 并使用 %p ,但你问的是错误代码的行为,而不是如何修复它。)

如果 int 事情会变得很奇怪和 int*尺寸不一样,或者如果 int s 和指针作为参数传递的方式不同(例如,某些 CPU 具有专用地址和/或浮点寄存器)。

printf("%d  %p\n",   a,  b);

很有可能void*float*具有相同的表示形式,尽管语言不能保证这一点。如果intint*恰好大小相同,并且使用相同的参数传递约定传递,这很可能会打印指针 a 的内容就好像它是一个 int对象,然后打印 b 的值作为指针。

//printf("%d  %f", a,  b);// but fails on parameter mismatch using %f

"%f"需要 double 类型的参数, 不是 float 类型( float 参数被提升为 double 对于可变参数函数,如 printf )。 如果 intint*大小相同, doublefloat*大小相同, 所有这些类型都使用相同的参数传递约定传递,那么这很可能会打印指针对象的值 a就好像它是一个 int , 和指针对象的值 b就好像它是一个 double目的。后者可能会为您提供完全垃圾的浮点值,甚至可能是 NaN 或 Infinity。但是,如果这些假设中的任何一个失败,printf可能会以某些顺序从堆栈(或寄存器)中获取数据,这些顺序可能与参数值匹配也可能不匹配。

以上每一项printf calls 具有未定义的行为,这意味着,严格来说,您不应该对会发生什么有任何期望——即使行为在任何方面都是一致的。了解幕后发生的事情可能有助于识别错误的原因(啊,那个垃圾浮点值看起来类似于我上个月弄乱格式字符串时得到的值),但实际上对其他任何事情都没有帮助。

printf("%d  %f\n"  ,  *a, *b);// prints normally (as expected)

啊,这更像是——但如果这是在之前的调用之后执行的,它们的未定义行为可能会把事情搞得一团糟,以至于即使这样也不起作用。另外,查看整个程序,变量 abmain (其地址传递给 printVar )未初始化,因此即使在最好的情况下也是 *a*b是垃圾。感谢 hacks 在评论中指出这一点。

关于c - float * 和 int * 的不同 printf 行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19190937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com