Сумма двух массивов

#c #arrays #sum

#c #массивы #сумма

Вопрос:

В упражнении говорится: «Создайте функцию с параметрами два массива int и k, который является их размером. Функция должна вернуть другой массив (размер k), где каждый его элемент является суммой двух массивов одинаковой позиции. Это то, что я написал, но это приводит к сбою. Должен ли я делать это с помощью указателей?

 #include <stdio.h>
#include <stdlib.h>

void sumarray(int k,int A[k],int B[k]){
   int sum[k],i;
   for(i=0;i<k;i  ){                
   sum[i]=A[i] B[i];
   printf("sum[%d]=%dn",i,sum[i]);}

 }



main(){
   int i,g,a[g],b[g];
   printf("Give size of both arrays: ");
   scanf("%d",amp;g);
   for(i=0;i<g;i  ){
      a[i]=rand();
      b[i]=rand();
   }
   sumarray(g,a,b);
   system("pause");
}
  

Пример: Если у меня есть A = {1,2,3,4} и B = {4,3,2,1}, программа вернет C = {5,5,5,5).

Комментарии:

1. Как далеко он заходит до сбоя?

2. Что за сбой? Что это за сообщение об ошибке? с каким вводом?

3. a и b должны быть указатели: int *a, *b , затем инициализируйте массивы с помощью malloc или calloc .

4. @Oli @David Это даже не начинается. Я получаю черный экран и сообщение об ошибке, и программа завершается.

Ответ №1:

Это:

 int i,g,a[g],b[g];
  

вызывает неопределенное поведение. Значение g не определено при инициализации, поэтому длина a и b будет неопределенной.

Вы, вероятно, хотите что-то вроде:

 int i, g;
int *a;
int *b;  // Note: recommend declaring on separate lines, to avoid issues
scanf("%d", amp;g);
a = malloc(sizeof(*a) * g);
b = malloc(sizeof(*b) * g);
...
free(a);
free(b);
  

Комментарии:

1. итак, что я должен вставить? Пользователь укажет размер массивов.

Ответ №2:

Это невозможно сначала сделать a[g] при динамическом получении g .

Ваши первые строки в main должны быть:

 int i,g;
int *a,*b;
printf("Give size of both arrays: ");
scanf("%d",amp;g);
a = (int *)malloc(g*sizeof(int));
b = (int *)malloc(g*sizeof(int));
  

Ответ №3:

 int sum[k] ;
  

k является переменной, но размер массива должен быть постоянным.

Функция должна вернуть другой массив (размером k) …

Но функция, которую вы написали, возвращает void , что явно неверно.

Должен ли я делать это с помощью указателей?

ДА.

Ответ №4:

Одна из проблем заключается в том, что вы пытались объявить массивы динамического размера в стеке (например, a[g] ). Вам нужно объявить указатели для каждого массива, а затем динамически выделить массив переменного размера, как только вы прочитаете значение g .

Комментарии:

1. Должен ли я сделать что-то вроде ‘a [l]’, а затем ‘g =amp;l’? Я не очень хорош в указателях.

2. В C99 было бы нормально объявлять массивы переменной длины после g считывания. Но для C общего назначения, тогда да, это то, что вы должны сделать.

Ответ №5:

измените итоговую подпись функции (часть определения объявления) на эту и попробуйте ее:

void sumarray(int k,int* A,int* B){