Thắc mắc về khai báo thiếu độ lớn mảng ký tự
Dear mọi người,
Hiện mình đang tự học lập trình C, mình đang làm bài tập ví dụ về mảng ký tự:
Code như sau:
#include <stdio.h>
#include <string.h>
main()
{
char Kid1[12];
char Kid2[] = "Maddie";
char Kid3[7] = "Andrew";
char Hero1[] = "Batman";
char Hero2[34] = "Spiderman";
char Hero3[25];
Kid1[0] = 'K';
Kid1[1] = 'a';
Kid1[2] = 't';
Kid1[3] = 'i';
Kid1[4] = 'e';
Kid1[5] = ' ';
strcpy(Hero3, "The Incredible Hulk");
printf("%s's favorite hero is %s.
", Kid1, Hero1);
printf("%s's favorite hero is %s.
", Kid2, Hero2);
printf("%s's favorite hero is %s.
", Kid3, Hero3);
return 0;
}
Output:
Katie’s favorite hero is Batman.
Maddie’s favorite hero is Spiderman.
Andrew’s favorite hero is The Incredible Hulk.
Sau đó mình thử modify lại Hero3[25] thành Hero3[3] để mảng Hero3 bị thiếu độ lớn so với chuỗi The Incredible Hulk.
Code:
#include <stdio.h>
#include <string.h>
main()
{
char Kid1[12];
char Kid2[] = "Maddie";
char Kid3[7] = "Andrew";
char Hero1[] = "Batman";
char Hero2[34] = "Spiderman";
char Hero3[3];
Kid1[0] = 'K';
Kid1[1] = 'a';
Kid1[2] = 't';
Kid1[3] = 'i';
Kid1[4] = 'e';
Kid1[5] = ' ';
strcpy(Hero3, "The Incredible Hulk");
printf("%s's favorite hero is %s.
", Kid1, Hero1);
printf("%s's favorite hero is %s.
", Kid2, Hero2);
printf("%s's favorite hero is %s.
", Kid3, Hero3);
return 0;
}
Output:
Katie’s favorite hero is Batman.
Maddie’s favorite hero is Incredible Hulk.
Andrew’s favorite hero is The Incredible Hulk.
Ở đây mình thắc mắc là tại sao chuỗi “The Incredible Hulk” có độ lớn hơn độ lớn cho phép của Hero3[3] lại làm ảnh hưởng đến giá trị của chuỗi Hero2[34] vốn có giá trị là “Spiderman”.
Hero2[34] lại mang giá trị hiện tại là “Incredible Hulk”, mất 3 ký tự đầu ứng với độ lớn của chuỗi Hero3[3]. Trong khi hiện giờ chuỗi Hero3[3] lại mang đúng giá trị “The Incredible Hulk” mà lại không phải là “Th” do độ lớn là [3].
Mình viết hơi lủng củng, rất mong các bạn giải đáp giúp. Cảm ơn mọi người rất nhiều.
Do cách push các local arguments vào stack. Đây là một kiểu tràn bộ đệm phổ biến.
Hero2 sẽ được push trước, tới lượt Hero3 được push. Lúc này Hero3 nằm trên Hero2, nhưng strcpy lại replace từ trên xuống dưới, do đó Hero2 sẽ bị thay thế bởi “Inc…”.
Ngoài ra, printf ("%s", ) sẽ in chuỗi cho đến khi gặp kí tự NULL.
mình nói cũng lủng củng do không có hình minh họa.
Stack:
cảm ơn bạn @Rok_Hoang nhiều lắm, bây giờ thì mình đã hiểu