2011-07-03 9 views
2
int main() { 


    char **k; 
    char *s ="abc"; 
    char *b ="def"; 

    *k = s; 


} 

//なぜセグメンテーションフォルトが生成されるのですか?何も問題なくスタックにすべてストアしてはいけませんか?マイナーメモリ割り当てに関する質問C++

+1

あなたは '* k'はどんなふさわしいと思いますか? 'k'は何を指していますか? – Cascabel

答えて

4

kはまだ定義されていない値なので、逆参照すると、未定義の動作が発生します。初期化を追加すると、k = &b;*k = s;がその後に動作します。

+1

char *は自動的に値を定義していますか? kを使う正しい方法は何でしょうか? – Mark

+2

@マーク: 'k =&s'と言うことができます。 –

+0

いいえ、 's'と' k'の両方を初期化して有効な値にしました。ポインタの逆参照とは、ポインタの値を読み取ってメモリアドレスとして扱い、このメモリアドレスにアクセスすることを意味します*。 'k 'が初期値を持たない場合、' * k'は基本的に 'k'の任意のビットパターンを指す任意の位置を読み込みます。 –

1

Alexander is correctの場合、k*k = s;で参照解除しています。 の初期化は同じように見えるかもしれませんが、それ以上の構文の砂糖です:char *s; s="abc";

2

[OK]を私は少しのエラーで殴られないように願っています...ここでそれを説明しようと私の試みです私ができる限り完全に。

通常のchar *ではcharを指します。

charを指定すると、charを指すポインタを指します。その* kの値はスタックではなくヒープ上にあります。このような

すなわち:

stack (1) heap (2) heap or ... (3) 
+-----+ +-----+  +----+ 
|char*| -> |char*| -> |char| 
+-----+ +-----+  +----+ 

今のchar * 'sが実際に文字列ではなく、彼らがnullまたはゼロバイトで終了しているメモリ内の連続印刷可能な文字のブロックとして扱われます。文字列は格納され、(3)で参照されます

コードを修正するには、char *(charではありません)にスペースを割り当てる必要があります。

すなわち、それは良いコードです、しかし、それがクラッシュしてはならないこと

*k = s; 

行の前に

k = (char**)malloc(sizeof(char*)); 

を入れていません。

+0

おっと、それを修正してください。 – Matt

+0

ああ、はい、今それはかなり明確です:)ありがとう! – sarnold

関連する問題