スタックスマッシングとは、ローカル変数用の関数のストレージ領域の外側 (過去/を通じて「スマッシュ」) を記述したことを意味します (この領域は、ほとんどのシステムおよびプログラミング言語で「スタック」と呼ばれます)。「スタック オーバーフロー」や「スタック アンダーフロー」と呼ばれるこのタイプのエラーが見つかる場合もあります。
あなたのコードでは、C はおそらく が指す文字列をa
スタックに置いています。あなたの場合、スタックスマッシュが発生する場所は、元のポインターst
を超えてインクリメントし、それが指す場所に書き込むときです。a
a
Cですでに適切に「予約」されているメモリ領域の外に書き込むときはいつでも、それは「未定義の動作」です(これは、C言語/標準が何が起こるかを述べていないことを意味します):通常、プログラムのメモリ (通常、プログラムは、リターン アドレスやその他の内部詳細など、他の情報をスタック上の変数のすぐ隣に置きます)、またはプログラムが、オペレーティング システムが使用を "許可" しているメモリの外側に書き込もうとします。いずれにせよ、プログラムは通常、すぐに明らかに (たとえば、「セグメンテーション違反」エラーで) 壊れます。
この場合、コンパイラはこの問題を検出するための特別な保護を備えたプログラムを構築しているため、プログラムはエラー メッセージを表示して終了します。コンパイラがそれを行わなかった場合、プログラムは実行を継続しようとしますが、最終的に間違ったことをしたり、クラッシュしたりする可能性があります。
解決策は、結合された文字列に十分なメモリがあることをコードに明示的に伝える必要があるということです。「a」配列の長さを両方の文字列に十分な長さに明示的に指定することでこれを行うことができますが、それは通常、必要なスペースが事前にわかっている単純な用途にのみ十分です。汎用ソリューションの場合malloc
、完全なサイズがどうなるかを計算したら、必要な/必要なサイズを持つオペレーティングシステムからメモリの新しいチャンクへのポインターを取得するような関数を使用します (使い終わっfree
たら、取得したポインターや同様の関数を呼び出すことを忘れmalloc
ないでください)。