while
ループ内に文字列を扱うループがfor
ループ内にあります。ここでは基本的に私のコードの構造です:C言語でのfree()関数の問題
char myString[1000];
//Initialize and maybe change myString
for(/*conditions*/){
while(/*conditions*/){
if(strchr(myString,' ') == NULL){
break;
}
char *temp = malloc(sizeof(char) * strlen(myString));
strcpy(temp,myString);
*strchr(temp,' ') = '\0';
strcat(myString," ");
strcat(myString,temp);
free(temp);
}
}
時々、このコードはうまく動作しますが、時には、プロセスが終了し、3を返し、エラーがあることを意味している(3、私は通常、取得戻り値です私はNULLを使用しようとしています。たとえば、がNULLの場合はmyPointer->example
です。いくつかのテストの後、問題の原因となった行がfree(temp);
であることが分かりました。私はif(temp != NULL){free(temp);}
と交換しようとしましたが、何も変わっていません。私はmalloc
の代わりにtemp
をchar temp[1000]
と宣言しようとしましたが、free(temp);
行を取り除いていますが、それでも同じことがあります。 free(temp);
行を取り除き、まだmalloc
を使用した場合、問題は解決されますが、代わりに膨大なメモリリークが発生するため、そのことはできません。エラーがあるかどうかは、myString
文字列に何があるかによって決まります。つまり、ある値がある場合は常にエラーがあり、ある特定の値がある場合はエラーはありませんが、どのタイプの値が機能し、どのタイプの値が機能しないかを調べることができないため、ランダムであると思われます。
なぜfree(temp);
が動作することがありますか、時には動作しない場合があります。どのようにして動作させることができますか?
'char * temp = malloc(sizeof(char)* strlen(myString)); strcpy(temp、myString); '境界外の書き込み、未定義の動作です。また、 'strchr()'が 'NULL'を返すなら、' NULL'の逆参照のための未定義の振る舞いもあります。 – EOF
また、 'sizeof(char)'は定義上1つで、 'malloc()'に渡される引数の一部として冗長です。 –
この問題は、単純な入力ミスが原因で発生したため、この質問を閉じることにしました。 –