Массив в C, содержащий неверные значения - PullRequest
1 голос
/ 25 марта 2019

Цель этой программы - сложить первый и последний элементы массива вместе и установить это значение в качестве первого элемента выходного массива, а затем продолжить движение внутрь как таковое. Все суммы будут сохранены в выходном массиве. Для этой программы правила предусматривают, что я могу использовать только указатели и арифметику указателей (т.е. без подписки, без '[]' и т. Д.). Я заставил программу работать и для массивов длины 2 и длины 4 (так как я реализована функциональность только для четных массивов), однако, когда я пытаюсь использовать любой массив длиной 6 или выше, программа складывает вместе неправильные значения, которых нет в первом массиве.

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

void add(int *a1, int array_size, int *a2) {

    int * p;
    int * temp = (a1+(array_size-1));

    if (array_size % 2 == 0) {
        array_size = array_size/2;
        for (p = a2; p < (a2+array_size); p++) {
            *p = *a1 + *temp;
            printf("%d", *a1);
            printf(" + %d", *temp);
            a1++;
            temp--;
            printf(" = %d\n", *p);
        }
    }

}

Для массивов длины 2 и 4 (опять же, сейчас я проверяю только четные числа), код работает нормально.

Пример вывода:

Enter the length of the array: 2                                                                                               

Enter the elements of the array:  1 2                                                                                          
1 + 2 = 3   
The output array is: 3

Enter the length of the array: 4                                                                                               

Enter the elements of the array:  1 2 3 4                                                                                      
1 + 4 = 5                                                                                                                      
2 + 3 = 5  
The output array is: 5 5

Теперь дело обстоит именно так.

Когда я делаю это:

Enter the length of the array: 6                                                                                                 

Enter the elements of the array:  1 2 3 4 5 6 

Я ожидаю:

1 + 6 = 7                                                                                                                        
2 + 5 = 7                                                                                                                        
3 + 4 = 7 

The output array is: 7 7 7

Но вместо , вывод:

1 + 0 = 1                                                                                                                        
2 + 3 = 5                                                                                                                        
3 + 4 = 7          

The output array is: 1 5 7  

Мое лучшее предположение - что-то пошло не так с моим использованием указателей или, возможно, синтаксиса указателей. Буду очень признателен за любую помощь, положительную или отрицательную.

Это функция main ():

int main() {

  int size = 0;
  int out_size = 0;
  int arr[size];

  printf("Enter the length of the array: ");
  scanf("%d", & size);
  printf("\nEnter the elements of the array:  ");
  for (int i = 0; i < size; i++) {
    scanf("%d", & arr[i]);
  }

  if (size % 2 == 0) {
      out_size = size/2;
  }
  else{
      out_size = ((size-1)/2) + 1;
  }

  int out[out_size];

  //calling the add function and using the addresses of arrays + array size
  add(arr, size, out);

  //iterating through and printing output array which has now been
  //altered by the move function
  printf("\nThe output array is: ");
  for (int i = 0; i < out_size; i++) {
    printf("%d ", out[i]);
  }
  return 0;
}

1 Ответ

3 голосов
/ 25 марта 2019

Вы используете массив размером 0:

int main() {
    int size = 0;
    int out_size = 0;
    int arr[size]; // <- Here is your problem

Вы можете переместить объявления массива после чтения size:

int main() {
    int size = 0;
    int out_size = 0;

    printf("Enter the length of the array: ");
    scanf("%d", & size);
    int arr[size];

    printf("\nEnter the elements of the array:  ");
    for (int i = 0; i < size; i++) {
        scanf("%d", & arr[i]);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...