gpt4 book ai didi

C - 多次递归写入一个指针后出现内存访问错误

转载 作者:太空宇宙 更新时间:2023-11-04 01:23:14 27 4
gpt4 key购买 nike

当我想到一个临时称为 FIF 循环(函数循环)的循环的想法时,我正在尝试许多不同且愚蠢的循环形式。

它工作得很好(它比常规循环慢 10 倍,但现在 nvm)直到它精确地重复了 174665 次。在第 174665 次重复时,它抛出 Cannot access memory at address on *k pointer in 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);
}
}

最佳答案

那是因为你把call stack炸了.

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 的行上,递归并压入变量 xik到堆栈上。经过足够多的时间后,您会用完空间并且程序会崩溃。如果您使用 -O3 进行编译,gcc 会将其转换为迭代,因为它是尾递归调用,但您绝对不应依赖此行为。你应该用循环来写这个。

关于C - 多次递归写入一个指针后出现内存访问错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36632503/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com