我明白當你寫的內存的一部分,你沒有自己發生Abort trap 6
,但我意識到一些有趣的事情,而這樣做ķ& [R演習。ç`中止陷阱: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的罰款。
所以出現了兩個問題:
- 爲什麼
char s[12] = "hello, "
不行的,而7
是什麼?看起來像尾數'\0'
需要一個大小爲13
的數組,但爲什麼7好呢?難道不是8? - 爲什麼
7
好擺在首位?尺寸8-12包含"hello, "
就像7字符大小的數組,並且被寫入超出其原始數組大小,但7
得到它,而其他人則沒有。
未定義行爲不必有一致或理智的結果。你調用了未定義的行爲;你會得到你所得到的。 –
@JonathanLeffler哪一部分產生未定義的行爲? – BridgeTheGap
當您將5個字符添加到大小爲7的數組(甚至不是以空字符結尾的字符串)時。 F'r'instance。 –