1. ホーム
  2. c

[解決済み] strtolによるセグメンテーションの不具合

2022-02-07 15:14:09

質問

ポインターで遊んでいます。

char a[]=" 0xa this is a343 good";
char* *endptr=NULL;
long int b=0;
b=strtol(a,endptr,0);
b=strtol(*endptr,endptr,0);

なぜ最後の行でセグメンテーションフォールトが発生するのでしょうか? *endptrchar * または? の挙動をよく理解していれば strtol ここでは、最初の整数を読み取ります。 10 で、次に *endptr の次のスペースへのポインタになります。 0xa . 私は正しいですか?

解決方法は?

あなたのクラッシュは strtol . 問題なのは、その値を持つポインタをデリファレンスしたことです。 NULL . これは不正で、クラッシュ(seg fault)を引き起こします。

あなたの問題はここです。

b=strtol(*endptr,endptr,0);
         ^^^^^^^
         Dereference a NULL leads to a crash

あなたの問題は、このコードと同じです。

char** endptr=NULL;
char* p = *endptr;  // Crash!!

だから、あなたの問題は、本当に何の関係もない strtol .

について strtol :

もし、あなたが strtol を更新するために *endptr である値を渡す必要があります。 ない NULL .

その方法とは、以下のようなものです。 char* 変数(注。 ではなく a char** のアドレス**を渡します。 char*strtol .

のように。

char a[]=" 0xa this is a343 good";
char* p;   // Notice: just one * as you need a pointer to char
long int b=0;
b=strtol(a, &p,0);
            ^^
            Notice: & (aka address of). So you pass the address of 
                    a pointer to char. Equivalent to char** as expected
                    by strtol