2015-08-27 39 views
0

我正在學習通過指針分配內存地址是C++。在C++中定義變量和指針(錯誤:分段錯誤(核心轉儲))

所以實踐中,我編寫了一個代碼,向我展示一個正弦信號的圖形以及Hanning窗口應用於該信號時的輸出。 輸出寫入文本文件,然後通過gnuplot讀取以顯示圖形。下面是代碼:

#include <stdlib.h> 
#include <stdio.h> 
#include <time.h> 
#include <iostream> 
#include <cmath> 
#include <fstream> 
using namespace std; 

int main() 
{ 
int i; 
double y; 
int N=20; 
double Fs=30000;//sampling frequency 
double T=1/Fs;//sample time 
double f=5000;//frequency 
double *in; 
double t[N-1];//time vector 
double *signal; 

for (int i=0; i< N;i++) 
{ 
    t[i]=i*T; 
    signal[i] =0.7 *sin(2*M_PI*f*t[i]);// generate sine waveform 
    double multiplier = 0.5 * (1 - cos(2*M_PI*i/(N-1)));//Hanning Window 
    in[i] = multiplier * signal[i]; 

    } 

fstream myfile; 

myfile.open("example2.txt",fstream::out); 

myfile << "plot '-' using 1:2" << std::endl; 
for(i = 0; i < N; ++i) 
{ 
    myfile << i << " " << in[i] << std::endl; 
    } 

myfile.close(); 

return 0; 
} 

所以我得到的錯誤是:分割故障(核心轉儲)並從我讀它是與內存的分配。所以我的問題是:

  1. 當我們應該定義由指針變量和分配存儲 地址?是當我們有一個輸入和輸出數組?在這 腳本,我可以簡單地寫入雙重;或者我必須寫*在?

  2. 我怎樣才能擺脫這種錯誤的:段錯誤(轉儲核心 )

+0

double * in(和其他變量類似)只是創建指針,它不分配內存。您必須先分配內存才能使用它。與聲明數組本身時必須聲明C風格數組的大小類似。 – 7VoltCrayon

+0

@Suleman,所以當我使用指針時,我總是必須使用malloc函數? – Jack

+0

那麼既然你使用C++,最好的選擇是使用一個向量,或者你必須有一個數組,然後聲明一個數組double信號[N];然後有一個指向其第一個元素的指針int * signalPointer =&signal [0]; (儘管它可能會直接導致signal [i] = 0.7 * sin(2 * M_PI * f * t [i]); – 7VoltCrayon

回答

1

您已經聲明:

double *in; 
double *signal; 

但沒有代碼來分配內存insignal

您可以通過在編譯時使它們的大小N陣列解決問題,

double in[N]; 
double signal[N]; 

或使用std::vector

std::vector<double> in(N); 
std::vector<double> signal(N); 

,或者從堆中分配他們記憶

double *in = new int[N]; 
double *signal = new int[N]; 

如果使用最後一種方法,m確保在函數結束之前釋放內存。

delete [] signal; 
delete [] in; 
+0

可以直接使用雙重信號,並且不會爲其分配任何內存? – Jack

+0

然後它只能保存一個SINGLE值,而不是一個值數組,所以你需要把它作爲一個數組(或者更好的一個向量,就像Barry和R Sahu上面提到的那樣) – 7VoltCrayon

0

未分配的內存insignal

double *in; 
double *signal; 
... 
for (int i=0; i< N;i++) 
{ 
    signal[i] = ... 
    in[i] = ... 
} 

因此,這是不確定的行爲。您需要在double* in = new double[N]或更好的std::vector<double> in(N)之前加上前言。

+0

所以你需要一個指向賦值的指針(N)中的std :: vector 意味着我正在爲我的變量指定一個內存嗎? – Jack

+0

@MaryE指針必須指向某個東西。['vector'](http:// en。 cppreference.com/w/cpp/container/vector)是一個標準的容器,爲你處理大量的這些東西。 – Barry

+1

@MaryE讓我們這樣來說吧 - 矢量類可以完成所有您嘗試的工作只有正確的。矢量使用的指針隱藏在矢量類中,所以在那裏沒有必要關心它。 – PaulMcKenzie

0

分段錯誤意味着您正在訪問您尚未分配的內存。

除了上述答案: 您聲明牛逼

double t[N-1];//time vector 

,然後訪問:

for (int i=0; i< N;i++) 
{ 
t[i]=i*T; 

所以你訪問超出了數組的邊界上的最後一次迭代循環。你應該聲明double t [N],或者改變你的for循環邊界。