Почему и как этот undefined int изменяется, когда я нахожу указатель на него? [Дубликат]

Использование регулярного выражения с флагом g заменит все:

someString = 'the cat looks like a cat';
anotherString = someString.replace(/cat/g, 'dog');
// anotherString now contains "the dog looks like a dog"

См. также

6
задан Deanie 11 May 2016 в 05:30
поделиться

4 ответа

Как это возможно, когда программа всегда назначает свободную ячейку памяти переменной?

Давайте рассмотрим пример практической реализации.

Предположим, что он использует стек для локальных переменных.

void
foo(void)
{
        int foo_var = 42;
}

void
bar(void)
{
        int bar_var;
        printf("%d\n", bar_var);
}

int
main(void)
{
        bar();
        foo();
        bar();
}

Полностью сломанный код выше показывает точку. После того, как мы вызываем foo, определенное место в стеке, где было размещено foo_var, установлено в 42. Когда мы вызываем bar, bar_var занимает это точное местоположение. И действительно, выполнение кода приводит к печати 0 и 42, показывая, что значение bar_var нельзя полагаться, если не инициализировано.

Теперь должно быть ясно, что требуется инициализация локальной переменной. Но может ли главное исключение? Есть ли что-нибудь, что могло бы сыграть со стеклом и в результате дать нам ненулевое значение?

Да. main - не первая функция, выполняемая в вашей программе. На самом деле есть тонны работы, необходимые для того, чтобы все наладить. Любая из этих работ могла бы использовать стек и оставлять на нем некоторые ненулевые. Не только вы не можете ожидать того же значения в разных операционных системах, это может очень сильно измениться в самой системе, которую вы используете прямо сейчас. Заинтересованные стороны могут использовать google для «динамического компоновщика».

Наконец, в стандарте языка C даже нет стека терминов. Наличие «места» для локальных переменных остается в компиляторе. Это может даже вызвать случайное дерьмо из того, что случилось в данном регистре. Это действительно может быть абсолютно все. Фактически, если запускается неопределенное поведение, компилятор имеет право делать все, что он чувствует.

9
ответ дан Bugs 5 September 2018 в 11:02
поделиться

Этот код вызывает Undefined Behavior (UB), поскольку указатель используется неинициализированным.

Компилятор должен выпустить предупреждение, когда используется флаг предупреждения, например -Wall например:

warning: 'i' is used uninitialized in this function [-Wuninitialized]
  cout << i;
          ^

Просто случается, что при этом запуске в вашей системе оно имело значение 0. Это означает, что значение мусора, которому была присвоено переменная, оказалось равным 0 , потому что остатки памяти там были предложены.

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

1
ответ дан gsamaras 5 September 2018 в 11:02
поделиться

Если вы не инициализируете переменную, определенную внутри функции, значение переменной остается неопределенным.

Этот бит истинен.

Это означает, что элемент принимает любое значение, ранее сохраненное в этом месте в памяти.

Этот бит не является.

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

Теоретически ваш компилятор может фактически назначить случайное начальное значение для этого целого, если оно того захотелось, поэтому попытка рационализировать это совершенно бессмысленно. Но давайте продолжим так, как если бы мы предположили, что «элемент принимает любое значение, ранее сохраненное в этом месте в памяти» & hellip;

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

Ну, это то, что происходит, когда вы предполагаете. :)

9
ответ дан Lightness Races in Orbit 5 September 2018 в 11:02
поделиться

Статические переменные и глобальные переменные инициализируются до нуля:

Global:
int a;  //a is initialized as 0

void myfunc(){
   static int x;     // x is also initialized as 0
   printf("%d", x);}

Где в качестве нестатических переменных или auto переменных, то есть локальные переменные являются неопределенными (неопределенный обычно означает, что он может что-то делать. Он может быть равен нулю, это может быть значение, которое было там, оно может привести к сбою программы). Чтение их до присвоения значения приводит к неопределенному поведению.

void myfunc2(){
   int x;        // value of x is assigned by compiler it can even be 0
   printf("%d", x);}

В основном это зависит от компилятора, но в большинстве случаев это значение считается принятым в качестве 0 по усмотрению

1
ответ дан S.I.J 5 September 2018 в 11:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: