加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C中更改函数内部的数组

发布时间:2020-12-16 10:01:15 所属栏目:百科 来源:网络整理
导读:我正在学习C并且困惑为什么在主要内部创建的数组不会在函数内部发生变化,我假设传递的数组是一个指针,并且更改指针应该更改数组,对吧?谁可以解释在这种情况下发生了什么? thx的帮助. int main(){ int i,length = 10; int array[length]; for (i = 0 ; i le
我正在学习C并且困惑为什么在主要内部创建的数组不会在函数内部发生变化,我假设传递的数组是一个指针,并且更改指针应该更改数组,对吧?谁可以解释在这种情况下发生了什么?

thx的帮助.

int main(){
    int i,length = 10;
    int array[length];

    for (i = 0 ; i < length ; i++)
        array[i] = i * 10;
    printf("Before:");
    print(array,length);
    change(array,length);
    printf("After:");
    print(array,length);

    return 0;
}

// Print on console the array of int
void print(int *array,int length)
{
    int i;
    for(i = 0 ; i < length ; i++)
        printf("%d ",array[i]);
    printf("n");
}

// Change the pointer of the array
void change(int *array,int length)
{
    int *new = (int *) malloc(length * sizeof(int));
    int i;
    for(i = 0 ; i < length ; i++)
        new[i] = 1;
    array = new;
}

我希望看到以下输出:

Before:0 10 20 30 40 50 60 70 80 90 
After:1 1 1 1 1 1 1 1 1 1

我得到了什么:

Before:0 10 20 30 40 50 60 70 80 90 
After:0 10 20 30 40 50 60 70 80 90

解决方法

在 c中,您不能通过引用传递变量,您在函数内分配的数组变量最初包含与传递指针相同的地址,但它是它的副本,因此修改它不会改变传递的指针.

你需要传递指针的地址才能改变它,就像这样

// Change the pointer of the array
void change(int **array,int length)
{
    *array = malloc(length * sizeof(int));
    if (*array == NULL)
        return;
    for (int i = 0 ; i < length ; i++)
        (*array)[i] = 1;
}

然后在main()中你不能分配给一个数组,通过这种函数这样做肯定是未定义的行为. main()中定义的数组是在堆栈上分配的,你不能为数组赋值,因为它们是不可写的左值,所以你不能指向使用malloc()获得的堆内存位置,你需要传递一个指针像这样

int *array;
change(&array,length);
free(array);

如果你想让函数替换以前的数组,它必须free()malloc()ed数据(请注意,将NULL传递给free()是很好的定义),所以

// Change the pointer of the array
void change(int **array,int length)
{
    free(*array);

    *array = malloc(length * sizeof(int));
    if (*array == NULL)
        return;
    for (int i = 0 ; i < length ; i++)
        (*array)[i] = 1;
}

然后在main()

int *array;
array = NULL;
change(&array,length);
change(&array,length);
free(array);

会做你显然想要的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读