2016-09-09 9 views
-1

の宣言の中で、私はCで、次の機能があります:あなたが見ることができるように、この機能文字 `*との差str`と`文字列str [] `文字列

int TransMinMaj(char *c) 
{ 
    if((*c) >= 'a' && (*c) <= 'z') 
    { 
     *c += 'A' - 'a'; 
     return 1; 
    } 
    else if((*c) >= 'A' && (*c) <= 'Z') 
     return 1; 
    return 0; 

} 

を:
1.リターン1文字がテストした場合、文字
2.大文字
3に下部ケースに変換されそうでなければ、(それは文字ではないことを示すために)0を返す

Iヘクタール渡されたパラメータcの値をメモリ内で変更したいので、アドレスでパラメータを渡すことを選択しました。

今、私の質問が来る: 私は私の関数は次のコード小枝テスト:今まで

char str[] = "abcdefg"; 
printf("Before: %s\n", str);  
TransMinMaj(&str[1]); 
printf("After: %s\n", str); 

を、すべてが良いですが、エラーなし、警告なし。ご覧のとおり、このテストでは、小文字のb(文字列の2番目の要素)もメモリの大文字「B」に変換します。

しかし、テストコードをリッテビット変更した場合:セグメンテーションエラー(コアダンプ)があり

char *str = "abcdefg"; 
printf("Before: %s\n", str);  
TransMinMaj(&str[1]); 
printf("After: %s\n", str); 

を。 しかし私は理由を知らない。
だからここに私の質問来る:
1.宣言でchar *strchar str[]の違いは何ですが?
2.私のセグメンテーションエラーはどこから来たのですか?

+0

質問をする前に検索を使用してください。あなたの質問が以前に尋ねられた可能性が非常に高いです。これは時間の始めから尋ねられています。 – 2501

+0

ポインタで行うことができます:ptr1 = ptr2;配列はありません。ポインタを使ってptr1 ++を実行できます。配列はありません。配列の場合、sizeof(array)/ sizeof(array [0])をポインタで呼び出すことはできません。そしてそのようなもの – jurhas

答えて

2
char str[] = "abcdefg"; 

char *str = "abcdefg"; 

二つの異なるものです。

  • 最初のものは、"abcdefg"で初期化配列、です。

  • 文字列リテラル"abcdefg"を指すポインタです。第2のケースで

リテラル文字列を変更しようとしたときに文字列リテラルを変更しようとするが、UBであるとして、あなたは、undefined behaviorを呼び出します。

関連する問題