Кодът по-долу идва от домашна работа, обсъждаща експлоатации на препълване на купчина, което разбирам като концепция. Това, което не разбирам, е какво точно се случва с malloc и указателите в този примерен код. Очевидно и двата указателя сочат към едно и също пространство в купчината, но защо е това? Няма ли malloc да запази място за buf1
и след това да запази друго място за buf2
?
int main(int argc, const char * argv[])
{
int diff, size = 8;
char *buf1, *buf2;
buf1 = (char * )malloc(size);
buf2 = (char *)malloc(size);
diff = buf2-buf1;
memset(buf2, '2', size);
printf("BEFORE: buf2 = %s",buf2);
memset(buf1, '1', diff +3);
printf("AFTER: buf2 = %s", buf2);
return 0;
}
Този код произвежда изхода
BEFORE: buf2 = 22222222AFTER: buf2 = 11122222
Много благодаря. :)
printf
. 2. Вие предполагате, че съществува някаква надеждна връзка между адреса на двата указателя. 3. Не прехвърляйте върнатата стойност наmalloc
. - person Ed S.   schedule 28.04.2014malloc()
извикване заделя 8 байта за вас, а второтоmalloc()
извикване заделя следващите 8 байта. Когато презапишете границите на първото разпределение, просто преминавате направо и започвате да пишете във второто разпределение. Не е гарантирано, че винаги ще получавате последователни разпределения като това, но ако разпределяте размери на блокове, които се делят на изискванията за подравняване, вероятно можете да очаквате нормален разпределител на памет да направи това. - person Crowman   schedule 28.04.2014buf1
иbuf2
сочат към два различни обекта. Изваждането на двата указателя има недефинирано поведение. - person Keith Thompson   schedule 28.04.2014