#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){