Вопрос, связанный с массивом - PullRequest
2 голосов
/ 13 июня 2010

У меня есть следующая программа:

int insert(int *array, int arraySize, int newElement)
{
   array[arraySize + 1] = newElement;
   return (arraySize+1);     // Return new Array size......
}
int main()
{
   int array[] = {1,2,3,4,5};
   int arraySize = sizeof(array) / sizeof(int);

   insertInArray(array, arraySize,6);
   print(array);
}

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

Пожалуйста, исправьте меня, если я делаю что-то не так.

Обновленный код:

int insert(int **array, int arraySize, int newElement)
{
   int i;    
   *array = realloc(*array,++arraySize * sizeof(int));    
   (*array)[arraySize] = newElement;    
   return (arraySize);
}

int main()
{
   int i;
   int arraySize = 5;
   int *array = (int *)malloc(arraySize * sizeof(int));
   for(i=1; i<=arraySize; i++)
      array[i] = i;

   printArray(array, arraySize);
   arraySize = insert(&array, arraySize,6);
   printArray(array, arraySize);
}

Ответы [ 2 ]

3 голосов
/ 13 июня 2010

Вы не можете просто увеличить размер массива C таким образом;это не динамично в этом отношении;не за что.Вы должны явно перераспределить память.Ситуация осложняется еще и тем, что память в C может быть выделена двумя способами: из стека (локальные переменные в функциях) и из кучи (вызовы malloc).(На самом деле, я полагаю, что это три способа, если вы включите глобалы / статику.)

Таким образом, есть две вещи, которые необходимо изменить:

  1. Если вы хотитеДля работы только с простыми массивами, а не со структурами, которые содержат массив и некоторую индикацию размера, ваша функция «вставки» должна будет выделить новую память и скопировать в нее старые значения массива
  2. Массивы, которыми она будет манипулироватьФункция должна быть выделена из кучи.
2 голосов
/ 13 июня 2010

Прежде всего, это приведет к переполнению буфера (на два):

Вы выделили место для 5 целых чисел (последний индекс 4).Затем:

array[arraySize + 1] = newElement;

выполняет запись в индекс 6, который находится на два после конца массива.Если вы хотите изменить размер массивов, вам нужно использовать realloc., А вашей функции нужна другая подпись, чтобы она могла изменять указатель.Что-то вроде (без проверки ошибок):

int insert(int **array, int arraySize, int newElement)
{
  *array = realloc(*array, ++arraySize * sizeof(int));
  (*array)[arraySize - 1] = newElement;
  return arraySize;     // Return new Array size......
}

int arraySize = 5;
int *array = malloc(arraySize * sizeof(int));
for(int i = 0; i < arraySize; i++)
{
  array[i] = i + 1;
}

arraySize = insert(&array, arraySize, 6);

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

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