通过值传递的变量是否可以更改其值? (在C中)

时间:2016-12-26 19:57:33

标签: c memory-management

我正在调用一个函数,其原型为int foo(int device, double *x, double *y) 而我这样称它为foo(dev, (double*)x, (double*)y);,其中x和y都是浮点数的指针。

由于某种原因,设备将该功能输入为1并以随机巨大值退出。

是否有可能因为foo处理了双打并且我通过浮动它与他们的记忆混乱?

1 个答案:

答案 0 :(得分:1)

  

由于某种原因,设备将该功能输入为1并以随机巨大值退出。

发生的事情可能更糟

你告诉系统你正在传递指向 8个字节的元素的指针 - 但这些元素的大小只有 4个字节。

所以被调用的函数,写入其接收到的指针的一个元素,实际上覆盖了两个元素(如果可用)。如果没有元素可用于接收值......

这种事情会导致"未定义的行为" - 字面上任何事情都可能发生(很少,程序甚至可以工作,没有人知道为什么 - 所以"但它有效!"不应该放心)。

我怀疑你已经将堆栈上的dev和x分配为临时变量:

float x[2];
int dev;

此时,x的地址指向调用者的堆栈内部,也是dev所在的堆栈。调用原型不匹配导致覆盖dev 并且谁知道还有什么即使您没有将dev作为参数传递,也会被覆盖所有相同的