Значение массива не меняется при обращении по адресу - PullRequest
0 голосов
/ 06 мая 2020

В этой программе в конце массива будет добавлено новое значение. Когда память перераспределяется, почему она не отражается обратно на фактический параметр

#include<stdio.h>
void insertion(int* arr,int *n)
{
    int val,n1=*n;
    int *temp;
    printf("\nEnter element to append");
    scanf("%d",&val);
    temp=malloc(sizeof(int)*n1);
        for(i=0;i<n1;i++)
        {
        temp[i]=arr[i];
        }
    n2=n1+1;
    arr=malloc(sizeof(int)*n2);
    for(i=0;i<n1;i++)
    {
        arr[i]=temp[i];
    }
    arr[n1]=val;
    *n=n2;
}
int main()
{
    int n=4;
    int arr[4]={1,2,3,4},i;
    insertion(arr,&n);
    for(i=0;i<n;i++) 
    {
        printf("\t%d",arr[i]);
    }
}

Ответы [ 2 ]

1 голос
/ 06 мая 2020

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

Вы меняете arr в insertion, нет причин, по которым следует изменять arr в main. Это разные переменные. Вот как работает C.

Но в основном arr - это массив, что означает, что его нельзя изменить, даже если вы правильно написали код.

Вот как это сделать все верно, если вы хотите что-то изменить в основном, вам нужно вернуть значение из вашей функции.

#include<stdio.h>

int* insertion(int* arr,int *n)
{
    ...
    return arr; // return the new value of arr
}

int main()
{
    int n=4;
    int* arr = malloc(n*sizeof(int)); // arr is a pointer, not an array
    for (int i = 0; i < n; ++i) 
        arr[i] = i+1;
    arr=insertion(arr,&n); // get the returned value from insertion
    for(i=0;i<n;i++) 
    {
        printf("\t%d",arr[i]);
    }
}
1 голос
/ 06 мая 2020

Для этого есть две причины.

Во-первых, вы присваиваете возвращаемое значение malloc значению arr, которое является параметром функции и, следовательно, локальным. Это означает, что изменение значения arr не отражается в вызывающей функции.

Даже если вы исправите это, у вас будет проблема, потому что arr в main - это фактический массив, размещенный локально , поэтому вы не можете изменить его размер.

Сначала вам нужно изменить arr в main на указатель и выделить для него место с помощью malloc, чтобы вы могли использовать realloc позже, и вам нужно изменить insertion на int **, чтобы можно было изменить фактическое значение указателя в main.

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