私はAbort trap 6
を知っています。あなたが所有していないメモリの一部に書き込んでいるときに発生しますが、K & R演習中に面白いことが分かりました。C特定の条件の下でのみ `Abort trap:6`
/* strcat: copies t to the end of s */
void _strcat(char *s, char *t) {
while (*s != '\0') {
s++;
}
while ((*s++ = *t++) != '\0') { }
}
#include <stdio.h>
int main() {
char s[7] = "hello, ";
char *t = "world";
_strcat(s, t);
printf("%s\n", s);
return 0;
}
char s[7] = "hello, "
である。
アレイのサイズが7である場合、"hello, "
、Abort trap 6
の正確な長さは、が_strcat
は、メモリの初期化部を越えて文字を追加しても、印刷されません。
8〜12の数値はAbort trap 6
ですが、13以上の数値は問題ありません。
ので、2つの疑問が生じ:
- を
7
がありながら、なぜchar s[12] = "hello, "
大丈夫ではないでしょうか?13
のサイズの配列が末尾に'\0'
のために必要ですが、なぜ7は大丈夫でしたか?それは8ではありませんか? - なぜ、
7
は大丈夫ですか?サイズ8-12には、サイズ7の文字配列と同じように"hello, "
が含まれており、元の配列サイズを超えて書き込まれていますが、7
はそれ以外の文字ではなくなります。
未定義の動作である必要がないため-string初期化子
@JonathanLeffler未定義のビヘイビアはどれですか? – BridgeTheGap
サイズが7の配列に5文字を追加すると、これはヌルで終了する文字列ではありません。 F'r'instance。 –