セグメンテーション違反は、メモリへのアクセスを実行すると、オペレーティング システムが想定されていないことを認識している場合にのみ発生します。
したがって、OS がメモリをページ単位 (通常は約 4KiB) に割り当てる可能性があります。str2
はおそらく と同じページにstr1
あり、ページの最後まで実行していないため、OS は認識しません。
それが未定義の動作に関することです。何でも起れる。現在、そのプログラムはあなたのマシン上で実際に「動作」しています。明日、str2
ページの最後に配置され、その後 segfault が発生する可能性があります。または、メモリ内の何か他のものを上書きして、まったく予測できない結果になる可能性があります。
編集:セグメンテーション違反を引き起こす方法:
ふたつのやり方。1 つはまだ未定義の動作ですが、もう 1 つはそうではありません。
int main() {
*((volatile char *)0) = 42; /* undefined behavior, but normally segfaults */
}
または、定義された方法でそれを行うには:
#include <signal.h>
int main() {
raise(SIGSEGV); /* segfault using defined behavior */
}
編集: segfault の 3 番目と 4 番目の方法
以下は、strcpy を使用した最初の方法のバリエーションです。
#include <string.h>
const char src[] = "hello, world";
int main() {
strcpy(0, src); /* undefined */
}
そして、この変種は私のためにのみクラッシュします-O0
:
#include <string.h>
const char src[] = "hello, world";
int main() {
char too_short[1];
strcpy(too_short, src); /* smashes stack; undefined */
}