3

Cで関数を書こうとしていstrlenますが、うまくいきません。

int strlen(char*string)
{
    int length=0;
    while(length[string]!='0')
    {
        ++length;
    }
    free(string);
    return length;
}

コンパイラを何度実行してもクラッシュし続けます。私のコードの何が問題なのですか?

4

6 に答える 6

15

あなたのwhileループは と比較すべきではありません'0'
'0'(ascii) は値 48 です!

文字列は 48 で終わりません
。文字列は 0 で終わります。

あなたがしているはずです:

while(length[string] != 0)

(そして、コード内の他の問題に関する他のすべての回答とコメントも正確です)

于 2012-12-28T20:50:32.630 に答える
14

おそらくfree、関数が所有していないメモリを使用しています。

例えば:

strlen("42");

は文字列リテラルであるため、クラッシュ"42"します。変更することはできません。

'0'は文字列の終了文字ではなく、実際の文字であることに注意してください'0'。またはのいずれ'\0'かを使用します0

を削除するfreeと、動作するはずです。

私はまた、より慣用的な を使用しますがstring[length]、これは注意してくださいstring == NULL

于 2012-12-28T20:47:57.127 に答える
4

ポインターが動的に割り当てられたオブジェクト (で作成されたオブジェクト) に割り当てられていないと推測しているため、クラッシュしますmalloc。ポインターだからといって、割り当てられたものに割り当てられたという事実は保証されずmalloc、したがって解放する必要があります。ポインターはオブジェクト (動的に割り当てられたものとは限りません) を指すことができます。この場合、ポインターは文字列リテラル ( "Hello World") に設定されていると想定しています。ポインターとそのポイント ee はスタックに割り当てられ、削除する必要はありません。freeこの場合、両方ともそれぞれのスコープの終わりに破棄されるため、不要です。さらに、作成したものはすべて削除/解放するmalloc 必要があります。そうしないと、メモリリークのリスクがあります。それ以外の場合は、で作成されたものに割り当てられていないポインターを解放しますmallocクラッシュを含む可能性のある未定義の動作を引き起こします。

于 2012-12-28T20:48:51.417 に答える
4

free と '0' を削除しても問題ありません。

int strlen(char*string)
{
    int length=0;
    while(length[string]!='\0')
    {
        ++length;
    }
    return length;
}
于 2012-12-28T20:51:36.923 に答える
3

どこでクラッシュしますか?そして、なぜ受け取ったポインターを解放するのですか? そうすれば、関数で長さを取得した後、文字列に対して何もすることができなくなります。

freeまたは、を使用して割り当てられていないメモリのチャンク、スタックなどを呼び出しているmalloc場合は、未定義の動作の領域にあり、クラッシュしてよかったと思うはずです。

特に のような呼び出しでメソッドを「テスト」すると、が を使用して割り当てられなかったstrlen("test")ため、プログラムがクラッシュします。char*malloc

于 2012-12-28T20:48:08.697 に答える
2

使ってみて

while(string[length]!=0)
于 2012-12-28T20:51:40.260 に答える