#include <stdio.h>
#include <stdlib.h>
void fun(int *arr)
{
arr=(int *)malloc(2*sizeof(int));
arr[0]=5;
arr[1]=4;
printf("in fun {%d, %d}",arr[0],arr[1]);
}
void anotherFunction(int *arr)
{
arr[0]=4;
arr[1]=5;
printf("in fun {%d, %d}",arr[0],arr[1]);
}
int main(void)
{
int *arr,*emptyInMain;
int arr2[]={99,99};
arr=(int *)malloc(2*sizeof(int));
arr[0]=99;
arr[1]=99;
printf("arr ");
fun(arr);
printf("\narr in main {%d, %d}\n",arr[0],arr[1]);
printf("emptyInMain");
fun(emptyInMain);
//printf("\narr in main {%d, %d}\n",emptyInMain[0],emptyInMain[1]); // WILL GIVE RUNTIME ERROR
printf("\n\--commented the line in the code because emptyInMain[0],emptyInMain[1] will give RUNTIME ERROR--");
printf("\narr2");
fun(arr2);
printf("\narr2 in main {%d, %d}\n",arr2[0],arr2[1]);
printf("\nfollowing output shows expected behaviour\n");
printf("\narr2");
anotherFunction(arr2);
printf("\narr2 in main {%d, %d}\n",arr2[0],arr2[1]);
return 0;
}
Мы все знаем, что передача массива в качестве аргумента является вызовом по ссылке. Как будто я посылаю массив arr = {99,99} функции, которая делает arr [0] = 4 и arr [1] = 5, значения также меняются на 4 и 5 в вызывающей функции. То же самое должно быть применимо, если я отправляю адрес переменной, а некоторые манипуляции выполняются в другой функции.Является ли массив аргументом в c действительно ссылочным типом?
Следующий вывод вышеуказанного кода меня смутил. Я хочу быть уверенным, что то, что я думаю, правильно или нет.
arr in fun {5, 4}
arr in main {99, 99}
emptyInMainin fun {5, 4}
--commented the line in the code because emptyInMain[0],emptyInMain[1] will give RUNTIME ERROR--
arr2in fun {5, 4}
arr2 in main {99, 99}
following output shows expected behaviour
arr2in fun {4, 5}
arr2 in main {4, 5}
Только последний выход показывает изменение.
Почему я думаю, что arr не изменился в первых трех случаях, мы отправляем адрес arr, который хранится в локальной переменной fun(). Эта локальная переменная начинает указывать на какой-либо другой адрес после заявления:
arr=(int *)malloc(2*sizeof(int));
anotherFunction() является единственной функцией, которая не изменяет распределение собственной локальной переменной и манипулирует значение, хранящееся в его (локальной переменной) адрес.
Пожалуйста, дайте мне знать, если неправильные мои предположения. Также, пожалуйста, дайте мне знать, какие наилучшие изменения я могу внести, чтобы сделать значения в изменении массива во всех случаях. Что я могу сделать, чтобы переменная указывала на местоположение с помощью malloc внутри вызываемой функции (я думаю, двойной указатель, но не уверен).
запомнить ключевой момент, C передает все параметры VALUE, даже ссылку. –
@ scarecrow-, да, но еще один важный момент, чтобы помнить, что у C нет ссылок. –
Если вы хотите, чтобы функция меняла значение своего аргумента, вы должны передать адрес аргумента в качестве аргумента в вызове и разыменовать _pointer_ внутри функции. – user3078414