2016-11-28 8 views
-1

は、私は、名前空間ECFSその中にインライン関数を持っている、と私は、次があります。書き込み時にSIGSEGVセグメンテーションフォルトが発生しますが、読み込みませんか?

inline void changeData(char* data, uint32_t len) { 
    for (; len != 0; --len, --curpos) { 
     std::cout << data[len] << std::endl; 
     data[len] = 'C'; 
    } 
} 

読み取りは絶対にうまく動作しますが、書き込みは、セグメンテーションフォルトが発生します。私はデータを割り当てて、lenが範囲外ではないことを確認しました。何が起きているのかわかりません。

編集:私はそれを呼び出すために使用している行は、次のとおりです。

char* str = new char[13]; 
str = "Hello world!"; 
ECFS::changeData(str, 12); // SIGSEGV 
+2

私たちにどのように呼びかけているかを教えてください。私はあなたが定数へのポインタを渡している$ 1,000を賭けるでしょう。 –

+0

参考: 'len'をインデックスとして使用する場合、インデックスは配列サイズ-1を通して0であることを考慮していません。呼び出し元はそれを考慮していますが、良いコーディング練習のためには、それをあなたの命名/使用法に示すことが助けになります。 – donjuedo

+0

@donjuedoとにかくwhileループ(正しいインデックス:P)に変更するつもりだったのですが、チップに感謝します。 – TheAbelo2

答えて

2
char* str = new char[13]; 
str = "Hello world!"; 
ECFS::changeData(str, 12); // SIGSEGV 

あなたが13バイトを割り当て、strでそれらへのポインタを格納します。その後、そのポインタを捨てて、定数を指すようにstrを変更します。次に、strが指しているものを修正しようとします。これは定数です。定数は変更できません。

あなたが望んでいた:

char* str = new char[13]; 
strcpy(str, "Hello world!"); 
ECFS::changeData(str, 12); 
+0

まだポインタに慣れています....ただ配列に書き込むと仮定しました。 :/ありがとう! – TheAbelo2

+1

ところで、良いコンパイラがあなたに警告を与えているはずです。 –

0

を配列に記述したコード

char* str = new char[13]; 
str = "Hello world!"; 

だけを想定して。

ここでは何も起こりません。

str = "Hello world!"; 

であなたは(一般的にアセンブリ内.rodataとして入れ)のみデータを読み込むためstr指し示すポインタを作っています。データのみを読み取るように書き込むと、セグメンテーションフォルトまたはSIGSEGVが返されます。