Динамическая Массивная печать - PullRequest
0 голосов
/ 24 марта 2011

Я пытаюсь распечатать динамический массив, но у меня проблемы с границами массива.Для простого примера, допустим, я пытаюсь перебрать массив целых чисел.Как я могу получить размер массива?Я пытался разделить размер массива на размер типа sizeof(list)/sizeof(int), но это не сработало правильно.Я понимаю, что пытался разделить размер указателя на тип.

int *list

// Populate list

int i;
for(i = 0; i < ????; i++)
  printf("%d", list[i]);

Ответы [ 6 ]

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

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

sizeof (list) также вернет 4, потому что компилятор вычисляет размер целочисленного указателя, а не размер вашего массива, и это всегда будет четыре байта (в зависимости от вашего компилятора).

0 голосов
/ 24 марта 2011

Если под размером вы подразумеваете количество элементов, то вы можете хранить его в счетчике, который получает ++ каждый раз, когда вы нажимаете элемент, или, если вы не возражаете против потерянных циклов, вы можете сделать функцию, которая получает копиюуказатель на первое местоположение, пробегает список, сохраняя счетчик, пока не найдет k.next == ноль.или вы могли бы вести список, который как следующий и предыдущий, таким образом, вас не волнует, если вы потеряли начало.

0 голосов
/ 24 марта 2011

Видя некоторые неправильные ссылки на инструменты C ++ для вопроса C, вот ответ для современного C.

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

Modern C имеет массивы переменной длины (VLA), которые можно использовать напрямую или через malloc.Direcly:

int list[n];

, и тогда ваша идея с sizeof работает «из коробки», даже если вы за это время поменяли n.Это использование должно быть предпринято с некоторой осторожностью, так как это размещено в стеке.Вы не должны резервировать слишком много здесь.Для использования с malloc:

int (list*)[n] = malloc(*list);

Тогда вам придется немного адаптировать свой код, в основном поместив (*list) везде, где у вас было всего list.

0 голосов
/ 24 марта 2011

ВЫ должны знать размер массива, как и вы, кто его выделил.
sizeof - это оператор, что означает, что он выполняет свою работу во время компиляции.Это даст вам размер объекта, но не длину массива.Итак, sizeof (int *) - 32/62-битный в зависимости от архитектуры.

Взгляните на std :: vector .

0 голосов
/ 24 марта 2011

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

0 голосов
/ 24 марта 2011

Не существует стандартизированного метода для получения размера выделенного блока памяти.Вы должны сохранить размер list в unsigned listSize следующим образом:

int *list;
unsigned listSize;

list = malloc(x * sizeof(int));
listSize = x;

Если вы кодируете на C ++, то лучше использовать контейнер STL, например std::vector<>

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