我正在调用一个函数,其原型为int foo(int device, double *x, double *y)
而我这样称它为foo(dev, (double*)x, (double*)y);
,其中x和y都是浮点数的指针。
由于某种原因,设备将该功能输入为1并以随机巨大值退出。
是否有可能因为foo处理了双打并且我通过浮动它与他们的记忆混乱?
答案 0 :(得分:1)
由于某种原因,设备将该功能输入为1并以随机巨大值退出。
发生的事情可能更糟。
你告诉系统你正在传递指向 8个字节的元素的指针 - 但这些元素的大小只有 4个字节。
所以被调用的函数,写入其接收到的指针的一个元素,实际上覆盖了两个元素(如果可用)。如果没有元素可用于接收值......
这种事情会导致"未定义的行为" - 字面上任何事情都可能发生(很少,程序甚至可以工作,没有人知道为什么 - 所以"但它有效!"不应该放心)。
我怀疑你已经将堆栈上的dev和x分配为临时变量:
float x[2];
int dev;
此时,x的地址指向调用者的堆栈内部,也是dev所在的堆栈。调用原型不匹配导致覆盖dev 并且谁知道还有什么。 即使您没有将dev作为参数传递,也会被覆盖所有相同的。