2011-05-29 91 views
5

我有签名的函数:为什么在返回语句后这个变量会改变?

int exe(int stack[][STACKSIZE], int sp[], int reg[][REGISTERSIZE], int next_instruct[], 
     int next_inst[], int cur_proc, int *terminate); 

它的最后两行:

printf("TWO cur_proc: %d\n",cur_proc); 
return NORMAL; 

,被称为是这样的:

printf("ONE cur_proc: %d\n",cur_proc); 
msg = exe(stack,sp,reg, next_instruct, next_instruct, cur_proc, &terminate); 
printf("THREE cur_proc: %d\n",cur_proc); 

而且我传递cur_proc这被认为是exe()内的“只读”(不是值得传递的值)变量。做我的东西在exe()里面。

而且我的输出是:

ONE cur_proc: 1 
TWO cur_proc: 1 
THREE cur_proc: -1 

,因为我看不到任何理由,这可能可能的负一层覆盖,这是非常令人困惑我。

这种奇怪行为的可能原因是什么?

+0

查看cur_proc更改其值的简单方法是将参数声明加上const前缀。编译器会在您更改其值的确切位置发出错误。 – 2011-05-29 06:24:09

+0

我先试了一下。没有错误,因为只要编译器知道它没有改变。 – 2011-05-29 06:40:06

+0

然后用[valgrind](http://valgrind.org)运行你的程序。你的程序的另一部分可能会破坏你的堆。 – 2011-05-29 07:06:29

回答

4

您可能正在写入其中一个数组的边界之外。

函数内部,您正在调用函数中查找变量的副本,而不是原始变量。因此,函数内部的printf()不会告诉您有关值在调用函数中何时损坏的信息。

查看传递的数组,并且在函数内部修改的数组是最可能的罪魁祸首 - 或者被修改的数组。由于没有一个数组是const限定的,所以很难说哪一个被修改,但有些可能会超出界限。

如果您想在调用函数的变化cur_proc从被调用函数内发生的跟踪,将指针传递给cur_proc到功能 - 以及或作为替代的价值 - 通过指针打印值。

+0

就是这样。堆栈函数正在写入范围之外。看着cur_proc的指针清除了它。 – 2011-05-29 06:37:33

3

如果exe函数中的代码将数据写入其中一个传入数组的某个无效位置,堆栈可能会损坏,这可能会改变堆栈中较高位置的局部变量的值(以及其他不好的事情)。

从函数的角度给出变量的只读本质,无论是发生这种情况还是另一个线程正在修改cur_proc的值 - 如果您没有线程调整,前者似乎更有可能。

大多数调试器允许您在“更改内存中特定地址的值”时放置断点。如果你得到了cur_proc的地址,并在这个地址的值发生变化时断开,你应该找到你的罪魁祸首。

+0

这也是我的第一个想法,但我以前从未见过。我将如何调试?(这是非线程BTW) – 2011-05-29 06:16:43

+0

大多数调试器允许您在“在内存中的特定地址更改值”放置断点。如果你得到了cur_proc的地址,并在这个地址的值发生变化时断开,你应该找到你的罪魁祸首。 – 2011-05-29 06:18:39

+0

......话说回来,Jonathan Leffler在他的回复中描述了如果你不了解调试器的方式,那么技术含量较低且更简单的方法 - 值得考虑。 – 2011-05-29 06:24:06

相关问题