c проблема отладки, бесплатный метод - PullRequest
0 голосов
/ 09 марта 2011

У меня проблема в программе на C:

char *str = (char *) malloc(20);
strcpy_s(str, 10, "abcdefghij");

//here I change one byte before str and one byte after
*((int*)str-1) = 10;
*((int*)(str+20)) = 10;

//and it stops on the..

free(str);

строка во время отладки, что не так?

Часть с перезаписью нераспределенной памяти является частью задачи.Я знаю, что обычно это не правильно, но в этом контексте это часть задачи.

Ответы [ 4 ]

5 голосов
/ 09 марта 2011

С какой стати вы думаете, что у вас есть право изменить что-либо, находящееся в str-1? Вы не:)

Похоже, у вас есть еще одна проблема, которая из-за яркости первой прошла мимо моего внимания. адреса, к которым вы можете получить доступ, варьируются от str + 0 до str + 19. str + 20 вне вашего царства :) 1007 *

Обе эти вещи приводят к тому, что называется неопределенным поведением . Это означает, что вы не можете удивиться при любом поведении! В том числе сбой free, сбой отладчика или что-то еще

4 голосов
/ 09 марта 2011

Запись в память вне того, что вы выделили, дает неопределенное поведение.

В этом конкретном случае мы можем догадаться, что диспетчер кучи , вероятно, имеет некоторую бухгалтерскую информацию о каждом блоке памяти, хранящемся непосредственно перед памятью, которую он передает вам. Когда вы записываете в байт перед выделенным блоком, вы перезаписываете какую-то его часть, поэтому он больше не может правильно освобождать блок.

4 голосов
/ 09 марта 2011

Вам не разрешено писать в str+20, потому что вы запросили только 20 байтов, поэтому str+19 - последний ваш байт. И то же самое относится к str-1.

2 голосов
/ 09 марта 2011

*((int*)str-1) часто используется для хранения длины выделенного пространства, так что free знает, сколько байтов нужно освободить ...

...