おいも貴婦人ブログ

生物系博士課程満期退学をしたAIエンジニアのブログ。

char *strとchar str[]で定義したときの挙動の違い。

上記の定義は一見違うように見えるが、ある文字列"___str"(アンダーバーはスペース)があり、このスペースを除く関数では挙動が違う。どうして違うのかは目下調査中、以下に正常に動作するコードとしないコードを載せる。下記の本に書いてありそう。

C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

一応、ちゃんとした結果を出すコード。

#include <stdio.h>
#include <string.h>

int main(void){
    char str1[]="  str1";
    int i,c=0;

    //ヌル文字でないかつスペースでない文字を先頭から数える。
    for(i=0;((str1[i]!='\0')&&(isspace(str1[i])));i++){
        c++;
    }
    //スペースでない文字を先頭にずらす。
    for(i=c;(str1[i]!='\0');i++){
        str1[i-c]=str1[i];
    }
    //文字列の最後にヌル文字を代入する。
    str1[i-c]='\0';
    fprintf(stdout,"%s\n",str1);
        
    return 0;
}

segmentation errorが出るコード。

#include <stdio.h>
#include <string.h>

int main(void){
    char *str1="  str1";
    int i,c=0;

    //ヌル文字でないかつスペースでない文字を先頭から数える。
    for(i=0;((str1[i]!='\0')&&(isspace(str1[i])));i++){
        c++;
    }
    //スペースでない文字を先頭にずらす。
    for(i=c;(str1[i]!='\0');i++){
        str1[i-c]=str1[i];
    }
    //文字列の最後にヌル文字を代入する。
    str1[i-c]='\0';
    fprintf(stdout,"%s\n",str1);
        
    return 0;
}