数组的值在通过地址调用时不会改变。

问题描述 投票:0回答:2

在这个程序中,新的值会在结束时被添加到数组中。当内存被重新分配时,为什么没有反映到实际的参数上?

#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]);
    }
}
c arrays pointers
2个回答
1
投票

这有两个原因。

首先,你将返回值分配给了 mallocarr的值,它是函数的一个参数,因此是局部的。 这意味着改变 arr 并没有反映在调用函数中。

即使你修正了这一点,你也会有一个问题,因为 arrmain 是一个实际的本地分配的数组,所以你不能改变它的大小。

你首先需要改变 arrmain 为指针,并为其分配空间,用 malloc 这样你就可以使用 realloc 后来,你需要改变 insertion 摄取 int ** 所以,实际指针值在 main 可以改变。


1
投票

因为参数是按值传递的。

你改变 arrinsertion这一点是没有理由改变的 arrmain. 它们是不同的变量。这就是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]);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.