2016-09-19 42 views
0

看看这个代码变量值变脏:C:在返回到调用函数

extern void f3(int); 

void f2 (int foo) { 
    //some stuff 
    f3(foo) 
    printf("f2:%d\n",foo); 
} 
void f1 (int foo) { 
     //some stuff 
     f2(foo); 
     printf("f1:%d\n",foo); 
} 

int main() { 
     //some stuff 
     f1(foo) 
     //other stuff 
     return 0; 
} 

我的问题是,我有这样的输出:

f2: 1060 //this is the correct value 
f1: 1065294485 

还有就是之间无码在函数f2中打印和函数结束。函数f2的调用和函数f1中的打印之间没有代码。这种价值变化有多可能? 我需要在堆栈中分配大数据结构,并使用ulimit -s 2^28。我还使用gcc -mO0 -m32 -msse进行编译,因为函数f3是使用sse写入nasm。问题依赖于这个吗? 向我咨询其他可能有助于理解问题的内容。

编辑:我示出了真实的F2()函数:

void upgma_start(float* centroids,int k,int c,int d,float* size,float *md) { 
    float mc1 [d]; 
    float mc2 [d]; 
    upgma(centroids,k,c,d,size,md,mc1,mc2); 
    printf("uuu:::%d:\n",k); 
} 

功能UPGMA是示例代码的函数f3,k为FOO变种

+0

f3的功能非常强大吗?你可以用虚拟函数替换它,并检查结果是什么? – maja

+0

这里最重要的是你把东西放在哪里//其他的东西 –

+6

我不能再现你所得到的东西。我们需要一个[最小化,完整和可验证的示例](http://stackoverflow.com/help/mcve) – Riley

回答

3

我需要分配大数据结构栈

为什么?为什么你不能简单地使用malloc/free?

问题依赖于此?

可能在你f2内存访问越界,达到成的f1栈帧。这与你的堆栈大小没有直接关系,但是你可能有一个超出边界的数组访问,并且索引太大,而不是写入f2的堆栈帧中的数组,因此你在f1中捣毁了某些东西。

如果您使用了动态内存,则此问题可能会表现为段错误。我强烈建议你切换到动态内存,并使用像Valgrind这样的内存调试器来追踪代码中的违规指令。

+0

我在开始时使用了malloc和free,但是如果我像创建一个函数myFunc()那样分配,使用和删除数据structeres并在一个循环中调用这个函数(double free error和类似的东西) 。 – user3415993

+1

分配/使用/销毁的函数由于循环而不会因为错误而产生双倍空闲错误。 – Zastai

+0

@datenwolf:我对某些结构使用了malloc/free,现在它似乎正常工作。谢谢。 – user3415993