Функция с побочными эффектами - PullRequest
0 голосов
/ 24 мая 2019

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

Мой компилятор говорит, что на устройстве не осталось места, и сигнализирует "collect2: error: ld return 1статус выхода ".Это как-то связано с указателями или я сделал ошибку в самой функции?

int load(int *a) {
    int i,n;
    printf("Input the number of elements ");
    scanf("%d", &n);
    a=malloc(n*sizeof(int));
    printf("Input the elements ");
    for(i=0;i<n;i++) 
        scanf("%d ",a+i);
    return n;
}

int add(int *a, int n) {
    int sum=0, i;
    for(i=0;i<n;i++)
        sum+=*(a+i);
    return sum;
}

int main() {
    int *a,n1,z1;
    n1=load(a);
    z1=add(a,n1);
    printf("Sum of the array is %d", z1);
}

1 Ответ

2 голосов
/ 24 мая 2019

В вашем коде логическая ошибка

int *a,n1,z1;

В основной функции переменная 'a' является переменной-указателем.

Это локальная переменная, которая не назначена ни одному адресу.

Указывает на некоторый случайный адрес. (Допустим, указатель указывает на адрес 0x1000)

n1=load(a);

Здесь передается только значение указателя.

То есть, 0x1000 передается и присваивается другой локальной переменной 'a' загрузки функции.

a=malloc(n*sizeof(int));

Здесь malloc возвращает динамически назначенный адрес.

=> значение, переданное в качестве аргумента, теряется, а новое значение, которое выделяется динамически, присутствует в локальной переменной-указателе 'a'.

scanf("%d ",a+i);

Все входные элементы назначаются по динамически назначенному адресу, а не по адресу 0x1000

z1=add(a,n1);

Здесь снова переменная-указатель главной функции 'a', которая указывает на некоторый случайный адрес, передается в качестве первого аргумента, а не в динамически выделенную память.

Поведение равно undefined , так как мы не знаем адрес, на который указывает переменная-указатель главной функции 'a'.

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