Проблема очень очевидна, поэтому я просто покажу вам код:)
#include <stdio.h>
#include <string.h>
char *test1()
{
static char c;
char *p;
p = &c;
printf("p[%08x] : %s\n", (unsigned int)p, p);
return p;
}
void *test2()
{
static char i;
char *buf;
int counter = 0;
for(buf = (char *)&i ; ;counter += 8)
{
memset(buf + counter, 0xff, 8);
printf("write %d bytes to static area!\n", counter);
}
}
int main()
{
char *p;
p = test1();
strcpy(p, "lol i asd");
p = test1();
strcpy(p, "sunus again!");
p = test1();
strcpy(p, "sunus again! i am hacking this!!asdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
p = test1();
test2();
return 0;
}
Сначала я написал test1()
.
Как видите, эти strcpy
должны вызывать ошибку сегмента, потому что он явно обращается к недопустимой области памяти. Я знал основы статической переменной, но для меня это просто странно.
Тогда я написал test2()
.
наконец, это вызвало ошибку сегмента, после он записал почти 4 Кбайт.
Итак, мне интересно, как избежать возникновения такого рода ошибки (переполнение статической переменной)?
Почему я могу получить доступ к этим статическим областям памяти?
Я знаю, что их нет ни в стеке, ни в куче.
PS. Возможно я не описываю свою проблему ясно.
У меня есть несколько лет опыта программирования на С; Я знаю, что произойдет, когда это не статично.
Теперь статика меняет почти все, и я хочу знать, почему.