【问题标题】:Consecutive identical "printf" calls produce different output连续相同的“printf”调用产生不同的输出
【发布时间】:2013-05-31 08:59:46
【问题描述】:

我连续调用 printf 函数,第一个 printf 写入它必须写入的内容,第二个 printf 只是写入无效值,我猜有些错误。

“LOC”的类型由我定义,变量“i”在调用后不会改变。 我检查了两次 printf 和我给它的值之间的任何差异。

i=2;
printf("x = %f,y = %f,z = %f\n",(*LOC)[0].ProjectionPoints[i].X,(*LOC)[0].ProjectionPoints[i].Y,(*LOC)[0].ProjectionPoints[i].Z); /* Prints perfectly */
printf("x = %f,y = %f,z = %f\n",(*LOC)[0].ProjectionPoints[i].X,(*LOC)[0].ProjectionPoints[i].Y,(*LOC)[0].ProjectionPoints[i].Z); /* Shows some errors and values are "0" */

首先 printf 写入

x = -10.000000,y = -8.000000,z = -10.000000

第二次 printf 写入

x = 0.000000,y = 0.000000,z = -1.#QNAN0

即使将变量定义为const 也不会改变任何东西。

我的编译器是:MS Visual C++ 2012

读完cmets后;

typedef struct {
P3C_Point *ProjectionPoints;
uint Distance,LayerID,NumberOfPoints,ModelID;} P3C_LayerOnCurtain;
/* and */
P3C_LayerOnCurtain **LOC = P3C_Compile(Stream);
/* when I try printf in P3C_Compile it has no problems */

我在返回值之前做了测试,在函数中产生的“LOC”是printf完美的。

答案/解决方案;

 P3C_LayerOnCurtain *LOC = *P3C_Compile(Stream);

【问题讨论】:

  • Cab 你构建了一个测试用例?
  • (你能告诉我们LOC的定义吗?)
  • 你必须向我们展示比这更多的代码。 LOC 在哪里声明,数组是如何分配的?我怀疑您正在读取未初始化或未分配的内存。
  • 请构建一个最小测试用例并将完整源代码放入您的问题中。
  • 这个问题几乎可以肯定,正如梅迪诺克所假设的那样;您已经从函数返回了 LOC,但是对 printf() 的第一次调用将 LOC 指向的空间重新用于其自身目的,因为您从返回 LOC 的函数返回了一个局部变量。你需要向我们展示足够多的P3C_Compile() 来展示返回值是如何分配的。

标签: c io double printf


【解决方案1】:

最可能的原因是LOC(*LOC[0].ProjectionPoints) 是指向返回它们的函数的局部变量的指针。

如果是这样,它们将被printf 的局部变量覆盖。

【讨论】:

  • 所有的局部变量都写在同一个地址吗?
  • 局部变量在函数返回时被销毁。任何后续的函数调用都会用自己的局部变量覆盖该空间。 “相同地址”有点用词不当,因为局部变量可以有不同的大小。
  • 在经典的 x86 架构上,局部变量存储在堆栈中:它们在创建时被“推送”,在销毁时被“弹出”。函数调用也使用堆栈来存储返回地址,因此没有局部变量的函数和大量嵌套调用也会覆盖局部变量。
猜你喜欢
  • 2017-05-21
  • 1970-01-01
  • 2019-06-14
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
  • 2015-04-22
  • 2016-02-01
相关资源
最近更新 更多