2016-11-17 1 views
-1

gccでコンパイルすると文字列を小さくするためにCでプログラムを作成しましたが、実行するとクラッシュします。 しかし、MSVCプログラムでスムーズに実行します。同じプログラムGCCがクラッシュしますが、msvcが動作します

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

char *strlower(char *s){ 
    for (; *s; ++s) *s = tolower(*s); 
    return (char *)s; 
} 

int main(){ 
    char *c = "HELLO"; 

    strlower(c); 
    printf("%s",c); 
    return 0; 
} 

変数cが配列の場合、プログラムは両方のコンパイラで動作します。 gccでポインタを使用しているとどうしてうまくいかないのですか?

+2

は、文字列リテラルを変更するには、未定義の動作を提供します。ビヘイビアーが定義されていないときは、異なるコンパイラーからの異なるビヘイビアーを含む何かが起こることが許されます。どちらのコンパイラも正しいです。 – Peter

答えて

2

すべての文字列リテラルは、です。読み取り専用文字の配列です。文字列リテラルを変更しようとすると、の定義されていない動作になります。そのため、文字列リテラルへのポインタを持つときには、const char *だけを使うべきです。

代わりに、独自の配列を使用してみてください:

char c[] = "HELLO"; 
関連する問題