Cで関数を書こうとしていstrlen
ますが、うまくいきません。
int strlen(char*string)
{
int length=0;
while(length[string]!='0')
{
++length;
}
free(string);
return length;
}
コンパイラを何度実行してもクラッシュし続けます。私のコードの何が問題なのですか?
あなたのwhile
ループは と比較すべきではありません'0'
。
'0'
(ascii) は値 48 です!
文字列は 48 で終わりません
。文字列は 0 で終わります。
あなたがしているはずです:
while(length[string] != 0)
(そして、コード内の他の問題に関する他のすべての回答とコメントも正確です)
おそらくfree
、関数が所有していないメモリを使用しています。
例えば:
strlen("42");
は文字列リテラルであるため、クラッシュ"42"
します。変更することはできません。
'0'
は文字列の終了文字ではなく、実際の文字であることに注意してください'0'
。またはのいずれ'\0'
かを使用します0
。
を削除するfree
と、動作するはずです。
私はまた、より慣用的な を使用しますがstring[length]
、これは注意してくださいstring == NULL
。
ポインターが動的に割り当てられたオブジェクト (で作成されたオブジェクト) に割り当てられていないと推測しているため、クラッシュしますmalloc
。ポインターだからといって、割り当てられたものに割り当てられたという事実は保証されずmalloc
、したがって解放する必要があります。ポインターはオブジェクト (動的に割り当てられたものとは限りません) を指すことができます。この場合、ポインターは文字列リテラル ( "Hello World"
) に設定されていると想定しています。ポインターとそのポイント ee はスタックに割り当てられ、削除する必要はありません。free
この場合、両方ともそれぞれのスコープの終わりに破棄されるため、不要です。さらに、作成したものはすべて削除/解放するmalloc
必要があります。そうしないと、メモリリークのリスクがあります。それ以外の場合は、で作成されたものに割り当てられていないポインターを解放しますmalloc
クラッシュを含む可能性のある未定義の動作を引き起こします。
free と '0' を削除しても問題ありません。
int strlen(char*string)
{
int length=0;
while(length[string]!='\0')
{
++length;
}
return length;
}
どこでクラッシュしますか?そして、なぜ受け取ったポインターを解放するのですか? そうすれば、関数で長さを取得した後、文字列に対して何もすることができなくなります。
free
または、を使用して割り当てられていないメモリのチャンク、スタックなどを呼び出しているmalloc
場合は、未定義の動作の領域にあり、クラッシュしてよかったと思うはずです。
特に のような呼び出しでメソッドを「テスト」すると、が を使用して割り当てられなかったstrlen("test")
ため、プログラムがクラッシュします。char*
malloc
使ってみて
while(string[length]!=0)