1

こんにちは、私は以下のようなコードを持っています

char *str ;

        strcpy(str, "\t<");
        strcat(str, time);
        strcat(str, ">[");
        strcat(str, user);
        strcat(str, "]");
        strcat(str, "(");
        strcat(str, baseName);
        strcat(str, ") $ ");

        printf("\String is now: %s\n", str);

このコードは機能しているように見えますが、XCode 分析関数を使用すると、「関数呼び出し引数は初期化されていない値です」と表示され、プログラムがクラッシュすることもあります..削除すると正常に動作します.何が問題なのですか? ありがとう

4

3 に答える 3

4

strcpystrcat文字列をコピーして、割り当てられた char 配列に連結するために使用されます。

初期化されていないためstr、メモリのどこかに書き込みを行っているため、他のデータが破損しているため、これは悪いことです。その時点では機能するかもしれませんが、遅かれ早かれプログラムはクラッシュします。

str を宣言するときは、メモリを割り当てる必要があります。

char str[100];

また、strcat文字列を連結する場所を知るために文字列の末尾を検索する必要があるため、効率的ではありません。を使用sprintfすると、より効率的になります。

sprintf(str, "\t<%s>[%s](%s) $ ", time, user, baseName);

最後に、生成された文字列が配列に適合することを保証できない場合は、snsprintf を使用することをお勧めします。

于 2011-08-31T09:02:47.393 に答える
2

メモリを割り当てず、初期化しないままにしますstr。それ以降の書き込みはすべて、「どこか」を指す初期化されていないポインターを介して行われます。これは未定義の動作です。

結果の文字列を保持するのに十分な大きさのメモリを割り当てる (そして後で解放する) 必要があります。

char *str = malloc( computeResultSizeSomehow() );
if( str == 0 ) {
   // malloc failed - handle as fatal error
}

//proceed with your code, then

free( str );
于 2011-08-31T08:53:36.407 に答える
2

これははるかに単純で、バッファオーバーフローによるエラーがありません:

#define BUFFERSIZE 512
char str[BUFFERSIZE];

snprintf(str, BUFFERSIZE, "\t<%s>[%s](%s) $ ", time, user, baseName);
于 2011-08-31T09:01:04.313 に答える