2017-12-12 10 views
-1

何らかの理由で、stringArr [n]のmallocを使用すると、strArr [n-1]の値に '!'最後の文字を '!'に置き換えます。 GDBでは、strArr [n]に代入すると文字列が検索されますが、nがインクリメントされるときにstrArr [n](この場合n + 1)をmallocすると、strArr [n-1]追加されました。なぜ私はこれが起こっているのか分からない。文字列配列の最後の値の末尾に感嘆符が表示されるC

char** stringArr = malloc(sizeof(char*)*28); 
char* token; 

int n = 0; 
while(n < 28) 
{ 
    token = //tokenize something here 
    stringArr[n] = malloc(sizeof(token)+1); 
    strcpy(stringArr[n], token); 
} 

答えて

2
stringArr[n] = malloc(sizeof(token)+1); 

あなたはこれを望んでいません。ポインタのsizeofが固定されているため(システム用)したがって、トークン化された各文字列をコピーするための固定長文字列を割り当てています(割り当てられた文字列よりも長さが長くなる可能性があります)。したがって、strcpyは、割り当てられていないメモリにもアクセスしています。これは未定義の動作です。

これは

stringArr[n] = malloc(strlen(token)+1); 

今、あなたはコピーする(NULがchar配列を終了)動的に割り当てられたメモリは、文字列を保持することが可能な長さを持っていることを確認していることになります。

また別のことは、戻り値がmallocであることを確認してください。 mallocが失敗した場合、それにアクセスする未定義の動作は実行されません。作業を終えたら、動的に割り当てられたメモリを解放してください。

+1

うわー、私はそれを信じられませんでした。それは私のシステムクラスの学期の終わりであり、私はまだ少しの間違いで追いついています:( – codemonkey

関連する問題