Возвращение char * / Странность отладчика Visual Studio - PullRequest
1 голос
/ 27 июня 2010

Мы получаем забавное поведение в отладчике Visual Studio со следующим.Я не уверен, что это код или какая-то странность отладчика (видел подобные вещи раньше).Мы пытаемся вернуть указатель на значение в массиве.

Странное поведение состоит в том, что значение x изменяется на равное y после вызова func () во второй раз ... по крайней мере, вот чтоон появляется в отладчике.

Полагаю, мой вопрос в том, является ли это даже допустимым / безопасным?
Указатели должны быть в куче в области видимости main (), верно, так что должно быть в порядке?

char stuff[100];

char * func()
{
    // i is random in the range
    stuff[i] = 'a';

    return &stuff[i];
}

main()
{
    char * x = func();
    char * y = func();
}

Ответы [ 4 ]

2 голосов
/ 27 июня 2010

Отлаживаете ли вы отладочную сборку?Вы часто получаете удивительные результаты, подобные этому, если отлаживаете сборку релиза.

Сборка отладки заставит компилятор поместить все переменные в стек и сохранить их для всей области видимости, так что вы получите ожидаемую отладкуПосмотреть.Сборка выпуска может повторно использовать пространство для одной переменной, если она никогда не будет использоваться снова, даже если она все еще находится в области видимости, и может хранить недолговечные переменные в регистрах процессора, а не в стеке.

ВВ сборке выпуска, скорее всего, x и y размещены в одной и той же ячейке памяти (или регистре), поскольку время их использования не перекрывается.Нет необходимости хранить x после первой строки, поэтому компилятору разрешено его отбрасывать.Если бы вы позже использовали x в функции, тогда ей потребовалось бы свое собственное пространство в стеке, поэтому вы, вероятно, увидите его в отладчике, как и ожидалось.

И чтобы ответить на ваш вопрос: даэто верно и правильно, пока i действительно находится в диапазоне.

1 голос
/ 27 июня 2010

Вы возвращаете указатели в один и тот же контейнер.И x, и y являются указателями на элементы array.Любые изменения, выполненные в array, будут видны через оба указателя, поскольку они ссылаются на одну и ту же область памяти.

Если вам нужны разные результаты, вам придется динамически размещать новые объекты (явно или неявно сиспользование std::string или std::vector - рекомендуется).

0 голосов
/ 27 июня 2010

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

0 голосов
/ 27 июня 2010

Значение указателя (адреса памяти) x не меняется.Память, на которую указывает x, изменяется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...