2016-12-26 32 views
0

我正在调用一个函数,其原型是int foo(int device, double *x, double *y) 而我这样称呼它是这样的foo(dev, (double*)x, (double*)y);,其中x和y都是指向浮点数的指针。通过值传递的变量是否可以更改其值? (In C)

由于某些原因,设备正在以1的形式输入函数并以随机巨大值退出。

是可能的,因为富处理双打,我通过浮游物与他们的记忆混为一谈?

+0

你没有得到'x'和'y'的指针,你将它们转换为指针。 –

+5

你所做的是告诉编译器x和y指向浮动,这实际上是一个谎言。因此,C语言标准会说你的程序有“未定义的行为”。它有可能做任何事情。 – Gene

+0

使演员沉默编译器警告可能会导致... –

回答

1

由于某些原因,设备进入函数1,并以随机巨大值退出。

发生了什么可能是比。

你告诉你传递指针,比如说元件的系统,字节 - 但这些要素是规模仅次于字节。因此,被调用函数写入其所接收指针的元素之一,实际上覆盖了两个元素(如果可用)。如果没有元素可用于接收值...

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

我怀疑你曾经在栈上分配的两种开发和x作为临时变量:

float x[2]; 
int dev; 

在这一点上,x的地址是在调用者的堆栈,哪里还开发居住里面指指点点。调用原型不匹配导致dev 的覆盖以及谁知道还有什么即使你没有通过dev作为参数,它也将被覆盖所有相同的

+0

就是这样,谢谢!我想在C中你真的要小心你的所作所为。 – Pedro

+0

不单单是在C :-)但是,你有。我经常保持*所有*警告启用,并建议你也这样做。此外,您可能会发现'valgrind'实用程序可用于调试难以发现的内存错误。 – LSerni