1

当我想到我暂时称为 FIF 循环(函数循环)的循环时,我正在玩许多不同且愚蠢的循环形式。

它工作得很好(它比常规循环慢 10 倍,但现在是 nvm),直到它完成 174665 次重复。在第 174665 次重复时,它会Cannot access memory at address在 *k 指针上抛出 line: void fif(bool (*f)(int *x),int i,int *k){。它总是在同一点崩溃(相同的重复)。任何想法为什么?在 Ubuntu 15.10,gcc 版本 5.2.1 20151010 上进行测试。我是 C 新手,所以请耐心等待 newbi :)。提前感谢您的帮助

我的代码:

#include <stdio.h>
#include <stdbool.h>

#define REPEATS 1.8E5

#ifdef WIN32

#include <windows.h>
double get_time()
{
    LARGE_INTEGER t, f;
    QueryPerformanceCounter(&t);
    QueryPerformanceFrequency(&f);
    return (double)t.QuadPart/(double)f.QuadPart;
}

#else

#include <sys/time.h>
#include <sys/resource.h>

double get_time()
{
    struct timeval t;
    struct timezone tzp;
    gettimeofday(&t, &tzp);
    return t.tv_sec + t.tv_usec*1e-6;
}

#endif

bool fifFunction(int *k);
void fif(bool (*f)(int *x),int i,int *k);

int main()
{
        //FIF

        printf("FIF loop\n");
        double t = get_time();
        int k = 0;
        fif(fifFunction,REPEATS,&k);
        printf("time: %f\n",get_time() - t);    
    return 0;
}

bool fifFunction(int *k)
{
        return (*k = *k + 1);
}


void fif(bool (*f)(int *x),int i,int *k){
    if (i > 0){
        if ((*f)((k)) == false){
            return;
        }
        fif(f,(i-1),k);
    }
}
4

1 回答 1

4

这是因为您炸毁了调用堆栈

void fif(bool (*f)(int *x),int i,int *k){
    if (i > 0){
        if ((*f)((k)) == false){
            return;
        }
        fif(f,(i-1),k); // HERE
    }
}

在标记为 的行上HERE,您递归并将变量xi和压入k堆栈。足够多的时间后,空间不足,程序崩溃。如果您使用 编译-O3,gcc 会将其转换为迭代,因为它是一个尾递归调用,但您绝对不应该依赖这种行为。你应该用一个循环来写这个。

于 2016-04-14T19:54:23.060 回答