次のように strcat を呼び出すと、アプリケーションが失敗します。理由は何ですか?
char *encryptedLine[255] = {0};
char encryptedLString[8];
sprintf(encryptedLString, "%08lX", L);
strcat(*encryptedLine, encryptedLString);
*encryptedLine
char
NULL ポインタです:バッファを指す必要があります。
*encyptedLine
encryptedLine[0]
の配列の最初のエントリであると同等char*
encryptedLine
です。
char *encryptedLine[255] = { 0 };
これは NULL ポインターです。
修正するには、次のいずれかに変更します。
char encryptedLine[255] = { 0 };
strcat(encryptedLine, encryptedString);
また:
encryptedLine[0] = malloc(255);
strcat(*encryptedLine, encryptedString);
encryptedLString
次のように、のサイズも1増やす必要があると思います。
sprintf(encryptedLString, "%08lX", L);
は 9 文字の書き込みを試みます: format で指定された 8 文字と、null ターミネータ用の 1 文字です。
char encryptedLString[9];
encryptedLine は、NULL に初期化された 255 個のポインターの配列です。*encryptedLine は NULL ポインターです。strcat の最初の引数として NULL ポインターを渡しているため、失敗します。
strcat()
最初のパラメーターとして 0 を使用しようとしています。*encryptedLine
でありencryptedLine[0]
、あなたはそれに割り当てられ{0}
ています
/* LINE 1*/ char *encryptedLine[255] = {0};
char encryptedLString[8];
sprintf(encryptedLString, "%08lX", L);
strcat(*encryptedLine, encryptedLString);
LINE1を見ると、すべて0に初期化された255個のポインターの配列がcharに割り当てられます。次に、strcatを実行します。これにより、encryptedLStringから、NULLであるポインター*encryptedLineが指す場所に値を書き込もうとします。許可されていません。
暗号化されたLineのポインタにメモリを割り当てるだけで、このプログラムはクラッシュしません。
ポインタの配列がありますchar
char *encryptedLine[255]
メモリを割り当てておらず、それらのいずれにも割り当てていません。クラッシュ。