segmentation fault 11
이 발생하면 프로그램에서 액세스가 허용되지 않는 메모리 영역에 액세스하려고 시도했음을 알고있었습니다.세그먼트 화 오류 11이 더 큰 작업 번호로 인해 발생 함
다음 코드를 사용하여 푸리에 변환을 계산하려고합니다.
nPoints = 2^15
(또는 적은 점수의 점)이 좋을 때 작동하지만, 점을 2^16
까지 추가로 늘리면 손상됩니다. 너무 많은 기억을 차지함으로써 야기 된 것인가 궁금합니다. 그러나 나는 수술 도중 너무 많은 기억 점령을 알아 차리지 못했다. 그리고 재귀를 사용하지만 내부에서 변환됩니다. 나는 그것이 많은 기억을 차지하지 않을 것이라고 생각했다. 그렇다면 문제는 어디에 있습니까? 미리
감사
PS : I 말할 깜빡 한가지이고, 최대 OS (8G 메모리)에 있던 상기 결과.
Windows (16G 메모리)에서 코드를 실행하면 nPoints = 2^14
일 때 오류가 발생합니다. 따라서 Windows PC의 메모리가 크기 때문에 메모리 할당으로 인한 것인지 혼란 스럽습니다 (두 운영 체제가 서로 다른 메모리 전략을 사용하기 때문에 실제로 말하기는 어렵습니다).
#include <stdio.h>
#include <tgmath.h>
#include <string.h>
// in place FFT with O(n) memory usage
long double PI;
typedef long double complex cplx;
void _fft(cplx buf[], cplx out[], int n, int step)
{
if (step < n) {
_fft(out, buf, n, step * 2);
_fft(out + step, buf + step, n, step * 2);
for (int i = 0; i < n; i += 2 * step) {
cplx t = exp(-I * PI * i/n) * out[i + step];
buf[i/2] = out[i] + t;
buf[(i + n)/2] = out[i] - t;
}
}
}
void fft(cplx buf[], int n)
{
cplx out[n];
for (int i = 0; i < n; i++) out[i] = buf[i];
_fft(buf, out, n, 1);
}
int main()
{
const int nPoints = pow(2, 15);
PI = atan2(1.0l, 1) * 4;
double tau = 0.1;
double tSpan = 12.5;
long double dt = tSpan/(nPoints-1);
long double T[nPoints];
cplx At[nPoints];
for (int i = 0; i < nPoints; ++i)
{
T[i] = dt * (i - nPoints/2);
At[i] = exp(- T[i]*T[i]/(2*tau*tau));
}
fft(At, nPoints);
return 0;
}
아마 배열을 스택에 할당해야합니다. 전역 또는 정적으로 만듭니다. –
'1 << 15'를 사용하는 정수에는'pow (2, 15);'를 사용하지 않는다. –
'out [i + step]':'out'은'n' 크기이고'i'는' n. 그게 문제 야. –