C - 多次递归写入一个指针后出现内存访问错误
C - Memory access error after multiple recursive writings to one pointer
当我想到一个临时称为 FIF 循环(函数循环)的循环的想法时,我正在尝试许多不同且愚蠢的循环形式。
它工作得很好(它比常规循环慢 10 倍,但现在 nvm)直到它精确地重复了 174665 次。在第 174665 次重复时,它在行中的 *k 指针上抛出 Cannot access memory at address
:
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
的行上,您递归并将变量 x
、i
和 k
压入堆栈。足够多次后,您 运行 超出 space 并且程序崩溃。如果您使用 -O3
进行编译,gcc 会将其转换为迭代,因为它是尾递归调用,但您绝对不应依赖此行为。你应该用循环来写这个。
当我想到一个临时称为 FIF 循环(函数循环)的循环的想法时,我正在尝试许多不同且愚蠢的循环形式。
它工作得很好(它比常规循环慢 10 倍,但现在 nvm)直到它精确地重复了 174665 次。在第 174665 次重复时,它在行中的 *k 指针上抛出 Cannot access memory at address
:
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
的行上,您递归并将变量 x
、i
和 k
压入堆栈。足够多次后,您 运行 超出 space 并且程序崩溃。如果您使用 -O3
进行编译,gcc 会将其转换为迭代,因为它是尾递归调用,但您绝对不应依赖此行为。你应该用循环来写这个。