Могу ли я иметь массив с неопределенной длиной в C? - PullRequest
0 голосов
/ 07 апреля 2020

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

#include <stdio.h>


int main(void) {

  int i,j;
  int a[i];

 for(i=0;i<10;i++)
 {
   printf("Enter Value Nummber %d:",i);
   scanf("%d",&a[i]);


   if 
     (a[i] == 101) break;
     else continue;


 }

Здесь я указываю, что максимальная длина может быть 10, но, если пользователь, например, дает только 4 значения, а затем 101, тогда он дает остальным точкам значения мусора.

Ответы [ 3 ]

2 голосов
/ 07 апреля 2020

В этом случае

  int a[i];

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

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

  • Определите верхний предел (#define MAXLEN 100) и используйте его для создания массива и инициализируйте его значением (скажем, 0).
  • Продолжайте запрашивать у пользователя вводные данные До тех пор, пока (что раньше)

    • Вы получите значение 101
    • Счетчик достигнет MAXLEN

В противном случае , если вы в порядке с использованием выделенной памяти (malloc() / realloc() и семейство), то:

  • Определите начальный размер ( #define INITSIZ 32)
  • Выделите память для этого размера, используя malloc().
  • Запросите ввод данных у пользователя.
  • Если вы получите входное значение 101, free() выделенная память и выход.
  • В противном случае, как только вы достигнете размера, удвойте выделение с помощью realloc() и перейдите к предыдущему шагу.
1 голос
/ 07 апреля 2020

Я рекомендую взглянуть на mallo c. Он позволяет динамически распределять память и дает указатель на начало выделенного фрагмента памяти.

Вы можете получить доступ к элементу с указателем, который указывает на первый элемент, а затем увеличивать указатель каждый раз, когда вы добавить значение. В отличие от других языков, C не препятствует доступу к значениям вне массива, поэтому следите за количеством элементов, добавляемых со счетчиком, и следите за тем, чтобы оставаться в выделенной памяти (поэтому сохраняйте длину в переменной). Затем вы можете заменить for l oop на бесконечное l oop и break, как только пользователь введет значение 101. Когда вы достигнете предела вашей выделенной памяти, вы можете выделить новый массив в два раза больше (поэтому обязательно сохраните длину в переменной) и скопируйте туда предыдущий массив, затем free первый массив.

0 голосов
/ 07 апреля 2020

" Могу ли я иметь массив с неопределенной длиной? "

Я не хочу, чтобы длина массива была инициализирована, скорее, когда пользователь введет 101 там будет последним значением и последним местом в массиве. Например, они ввели 101 на третьем месте, тогда длина массива была бы 4. Я не знаю, возможно ли это.

Нет, это невозможно.

int a[i];

Невозможно выполнить запись в неопределенный массив, так как i не инициализирован - он содержит значение мусора.

Любая такая попытка является неопределенным поведением и не имеет особого смысла.

Как вы хотите сохранить значение, которое пользователь вводит в предполагаемый третий элемент, если для этого не было выделено места?

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

Я не понимаю вашу идею позади. Может быть, вы объясните большую цель, которую вы хотите достичь.

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