在C中更改函数内的数组

2024-05-08

我正在学习 C,并且很困惑为什么在 main 中创建的数组不会在函数内部更改,我假设传递的数组是一个指针,并且更改指针应该更改数组,对吧?有人可以解释这种情况下发生了什么吗?

谢谢你的帮助。

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 

In c /questions/tagged/c你不能通过引用传递变量,array您在函数内部分配的变量最初包含与传递的指针相同的地址,但它是它的副本,因此修改它不会改变传递的指针。

您需要传递指针的地址才能更改它,如下所示

// 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;
}

Then in main()你不能分配给一个数组,通过这种函数这样做肯定是未定义的行为。中定义的数组main()是在堆栈上分配的,并且您不能将任何内容分配给数组,因为它们是non-可写lvalues所以你不能让它指向通过获得的堆内存位置malloc(),你需要传递这样的指针

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

如果您希望该函数替换以前的数组,则必须free() the malloc()编辑数据(请注意,通过NULL to free()是明确定义的), so

// 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;
}

then in main()

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

会做你显然想做的事。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在C中更改函数内的数组 的相关文章

随机推荐