C 不同数量的printf调用的不同输出
我是C语言的新手,我的代码有一个奇怪的问题 我正在尝试创建一个C 不同数量的printf调用的不同输出,c,struct,printf,malloc,nan,C,Struct,Printf,Malloc,Nan,我是C语言的新手,我的代码有一个奇怪的问题 我正在尝试创建一个struct数组,作为另一个struct数组的一部分 当printf函数的数量不同时,我会获得不同的输出。我有两个案例,一个是正确的,另一个是错误的 我不明白为什么一个额外的printf的简单调用会改变结果 这是我的代码,结果不正确,这里我得到“x速度=-nan” 我获得: "velocity x=-nan" 当功能为: void create_time(struct block *blocks,int Nsteps,int nb)
struct
数组,作为另一个struct
数组的一部分
当printf
函数的数量不同时,我会获得不同的输出。我有两个案例,一个是正确的,另一个是错误的
我不明白为什么一个额外的printf
的简单调用会改变结果
这是我的代码,结果不正确,这里我得到“x速度=-nan”
我获得:
"velocity x=-nan"
当功能为:
void create_time(struct block *blocks,int Nsteps,int nb){
int i,t;
double u;
for (i=0;i<nb;i++){
for(t=0;t<Nsteps;t++){
u=0.5+t;
blocks[i].velocity[t].x=&u;
printf("u %lf \n",u);
printf("velocity x=%lf \n",blocks[i].velocity[t].x);
}
}
}
等等
我添加该行只是为了验证变量u
,然后我意识到添加它会更改printf
的输出
发生了什么事?为什么更改了printf的输出?此处
printf("velocity x=%lf \n",blocks[i].velocity[t].x);
您传递的不是double
,而是指向double
的指针,尽管需要double
。这引发了臭名昭著的未定义行为。不要这样做
我还想知道为什么编译器没有就此警告您。您可能希望提高编译器的衰退级别。对于GCC,在编译时添加选项-Wall-Wextra-pedantic
要修复此问题,请将其更改为
printf("velocity x=%lf \n", *blocks[i].velocity[t].x);
所以要回答你的问题:
发生了什么事?为什么printf的输出会改变
欢迎来到未知行为的神秘世界
除此之外,请注意这条线
blocks[i].velocity[t].x=&u;
是危险的,因为您将函数的局部变量的地址分配给指针,而指针很可能在函数离开后使用
函数离开后,它不再指向有效内存
然后取消引用它将调用未定义的行为,请小心
作为最后一个友好的提示:请帮助您自己和您的同事阅读您的代码,并正确缩进代码。这是免费调试。我有一个强烈的印象,那是由于代码的混乱缩进,如图所示。
x
是一个指针double*x
。你需要尊重它<代码>*块[i].速度[t].x)代码>。打开编译器警告并解决每个警告。块[i]。velocity
分配应该在t
循环之外。感谢您的建议。非常感谢!:D
printf("velocity x=%lf \n",blocks[i].velocity[t].x);
printf("velocity x=%lf \n", *blocks[i].velocity[t].x);
blocks[i].velocity[t].x=&u;