最近在研究字串複製的使用(strcpy, strncpy, memcpy, snprintf)
在strcpy的case中,有兩種情況下會Segmentation fault(程式碼1, 2)
問題.想請問在[程式碼1]為什麼src的大小超過dest的大小
會讓src的address變了呢? (由原本的0x8048af5到0x8040030)
而導致在strcpy的時候沒事,而在印src字串時導致Segmentation fault
謝謝!!
[程式碼1]
void test()
{
char dest[5] = "ABCDE";
char *src = "1234567890";
printf("Dest = %s, Address = %p\n", dest, dest);
printf("Src = %s, Address = %p\n", src, src);
strcpy(dest, src);
printf("======================================\n");
printf("[strcpy] Dest = %s, Address = %p\n", dest, dest);
printf("[strcpy] Src Address = %p\n", src);
printf("[strcpy] Src = %s\n", src);
}
[執行結果]
# ./a.out
Dest = ABCDE, Address = 0xbffa7e53
Src = 1234567890, Address = 0x8048af5
======================================
[strcpy] Dest = 1234567890, Address = 0xbffa7e53
[strcpy] Src Address = 0x8040030
Segmentation fault (core dumped)
[程式碼2]
char dest[5] = "ABCDE";
char src[10] = "1234567890";
strcpy(dest, src);
[執行結果2]
因為src沒有\0停下來 所以strcpy會導致複製src時會一直複製,而產生Segmentation
fault
E 5
D 4
C 3
B 2
Dest A 1
0
9
8
7
6
5
4
3
2
Src 1
[strcpy原型]
char *strcpy(char *s1, const char *s2)
{
char *s = s1;
while ((*s++ = *s2++) != 0) {
;
}
return (s1);
}