【C言語】
strtok()のSegmentation faultを再現する20行の短いサンプルコード

“文字列リテラル”書き込み禁止 strtok()で Segmentation fault

strtokの意味

strtok=string+token
string=文字列
token=単語
strtokは文字列を単語に分解する関数です。

strtokの簡単な使い方

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void    文字列を分離文字で分解(char *文字列)
{
    char *単語;
    const char *分離文字 = "/";
    while((単語 = strtok(文字列,分離文字)) != NULL){
        printf("\t処理中->:%s:\n",単語);
        //strtok第1引数は2回目からNULL
        文字列 = NULL;
    }
}
int main(void)
{
    char    文字列[] = "/usr/include/stdio.h";// 正常終了
    printf("処理前:%s\n",   文字列);
    文字列を分離文字で分解( 文字列);    
    printf("処理後:%s\n",   文字列);
}

strtok()は元の文字列は変わってしまうので注意して下さい。

●実行結果

./a.out
処理前:/usr/include/stdio.h
        処理中->:usr:
        処理中->:include:
        処理中->:stdio.h:
処理後:/usr
-------------------

strtok(”文字列リテラル”)でSegmentation faultが発生する

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void    文字列を分離文字で分解(char *文字列)
{
    char *単語;
    const char *分離文字 = "/";
    while((単語 = strtok(文字列,分離文字)) != NULL){
        printf("\t処理中->:%s:\n",単語);
        //strtok第1引数は2回目からNULL
        文字列 = NULL;
    }
}
int main(void)
{
    char    *文字列 = "/usr/include/stdio.h";//異常終了
    printf("処理前:%s\n",   文字列);
    文字列を分離文字で分解( 文字列);    
    printf("処理後:%s\n",   文字列);
}

●実行結果

./a.out
処理前:/usr/include/stdio.h
Segmentation fault (コアダンプ)

現代のほとんどのコンパイラは文字列リテラルの変更はできません。
strtok()は解析対象の元の文字列を書き換えます。

strtok()に書き換えができない文字列リテラルを渡すと
コンパイラによって異常終了します。

筆者の環境下では、
異常終了してしまいました。