Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 不同数量的printf调用的不同输出_C_Struct_Printf_Malloc_Nan - Fatal编程技术网

C 不同数量的printf调用的不同输出

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)

我是C语言的新手,我的代码有一个奇怪的问题

我正在尝试创建一个
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;