ポインタセグメントエラーsegament fault

6522 ワード

http://blog.chinaunix.net/space.php?uid=21830881&do=blog&id=1813978
以下、例プログラム:#include <stdio.h>

int main(int argc,char ** argv){
    char * p ;

    //p =    '\0';
    //p = "abcdefg";
    //*p = "abcdefg"[5];//segament fault//セグメントエラー    *= "abcdefg";//segament fault //
    //p = &("abcdefg" [5]);
    printf("%s
"
,p);

    return 0;
}
セグメントが間違っています.2行は、ポインタ変数pのため、野ポインタです.
△つまり、pのメモリ空間にはアドレス値がないので、システムは*pがどこを指しているのか分からない.
① 
char * p ; = '\0';
char * p; 
ポインタ変数を定義します. 
(システムはpにアドレス(例:0 xaaa)を割り当てた.このアドレス空間内の値も、アドレス(一時的にNULLか何か分からない)であるべきである.)
(「何なのか分からない」はint iを定義し、i値を与えずにiを直接印刷する.その印刷結果は何なのか分からない.iの下の整形データはランダムである.「ランダム」でも正確ではない.実はシステムがiに割り当てたアドレスの下に保存した値であり、たまたま何なのか.)

= '
\0
';
'0',システムはメモリのデータ領域に1つ置かれています.
\0
'.

データエリアのこれ
'
\0
'のアドレスは、p、すなわち0 xaaaのメモリ空間に格納される.
だから*pは、

区のこれによれば
'
\0
'.
指针 段错误 segament fault_第1张图片
= "abcdefg";
= &("abcdefg" [5]);

①と同じです.
文字列のヘッダアドレスをpのメモリ空間の下に置くことです.文字列の6番目の要素のヘッダアドレスをpのメモリ空間の下に置く.
printf("%s",p);印刷結果はabcdefgとfgです.
"abcdefg" [5]の表記と「char str[]=「abcdefg」str[5];’という書き方です.
*= "abcdefg"[5];//segament fault //
*= "abcdefg";
//segament fault//セグメントエラー
*pが指すメモリ領域に値を割り当てることを意味します.
でも*pはどこを指しますか?pのメモリの空間の下でも明確なアドレスの値を保存していませんか?
システムはどこを指すべきか分からないので、
//segament fault//セグメントエラー
 .
指针 段错误 segament fault_第2张图片