Почему не ценности мусора - PullRequest
1 голос
/ 02 февраля 2011

Ребята, это программа, которую я запустил на моем компиляторе, и я получаю 30 0 0 0 в качестве вывода. Можно объяснить, почему значения равны 0.указывают на что-то вне массива, так что это не будет мусором.Почему значения мусора не печатаются, вместо них на выходе появляются 0.

void main()
{
  int array[4]={10,20,30,40};
  int *tmp=array;
  for (int i=0;i<4;i++)
  {
    tmp+=sizeof(int);
    printf("%d",*tmp);
  }
  getch();
}

Ответы [ 3 ]

5 голосов
/ 02 февраля 2011

Вы не добавляете sizeof(int) к указателю int, чтобы перейти к следующему элементу массива;Вы добавляете 1. Добавление sizeof(int) будет продвигаться на sizeof(int) элементов (вероятно, 4 элемента), что приведет вас к концу массива.Это ваша проблема.

Редактировать: ОК, очевидно, программа была частью вопроса об интервью, предназначенного для иллюстрации неопределенного поведения, и правильный ответ на вопрос об интервью состоит в том, что когда-то неопределенное поведение быловызвано, все может произойти.

3 голосов
/ 02 февраля 2011

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

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

1 голос
/ 02 февраля 2011

В этом случае sizeof (int) составляет 2 байта, поэтому он печатает 30 (сначала указатель указывает на ячейку памяти, имеющую значение 10, а затем указывает на 30, впоследствии он печатает это значение).

Затем снова указатель перемещается вперед на 2 позиции, поэтому он пропускает 40 и выходит за границы.0, как было указано ранее, является случайным значением мусора, хотя выглядит так, как будто значения правильные. Попробуйте снова выполнить код после объявления еще нескольких переменных вместе с массивом и просмотрите вывод.

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