在这个程序中,新的值会在结束时被添加到数组中。当内存被重新分配时,为什么没有反映到实际的参数上?
#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]);
}
}
这有两个原因。
首先,你将返回值分配给了 malloc
到 arr
的值,它是函数的一个参数,因此是局部的。 这意味着改变 arr
并没有反映在调用函数中。
即使你修正了这一点,你也会有一个问题,因为 arr
在 main
是一个实际的本地分配的数组,所以你不能改变它的大小。
你首先需要改变 arr
在 main
为指针,并为其分配空间,用 malloc
这样你就可以使用 realloc
后来,你需要改变 insertion
摄取 int **
所以,实际指针值在 main
可以改变。
因为参数是按值传递的。
你改变 arr
在 insertion
这一点是没有理由改变的 arr
在 main
. 它们是不同的变量。这就是C语言的工作原理。
但在main arr
是一个数组,这意味着即使你把代码写对了也不能改变它。
下面是如何做正确的,如果你想在main中改变一些东西,你必须要做到 返回 从你的函数中获取的信息。
#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]);
}
}