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

Vic*_*ira 6 c arrays pointers function

我正在学习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;
}
Run Code Online (Sandbox Code Playgroud)

我希望看到以下输出:

Before:0 10 20 30 40 50 60 70 80 90 
After:1 1 1 1 1 1 1 1 1 1 
Run Code Online (Sandbox Code Playgroud)

我得到了什么:

Before:0 10 20 30 40 50 60 70 80 90 
After:0 10 20 30 40 50 60 70 80 90 
Run Code Online (Sandbox Code Playgroud)

Iha*_*imi 14

你不能通过引用传递一个变量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;
}
Run Code Online (Sandbox Code Playgroud)

然后在main()你不能分配给一个数组,通过这种功能这样做肯定是未定义的行为.中定义的数组main()被分配在栈上,你不能分配到任何一个数组,因为它们是 -writeable 左值,所以你不能让它指向与所获得的堆内存的位置malloc(),你需要通过这样的指针

int *array;
change(&array, length);
free(array);
Run Code Online (Sandbox Code Playgroud)

如果您希望该函数替换以前的数组,则必须free()使用malloc()ed数据(请注意,传递NULLfree()定义明确),所以

// 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;
}
Run Code Online (Sandbox Code Playgroud)

然后在 main()

int *array;
array = NULL;
change(&array, length);
change(&array, length);
change(&array, length);
change(&array, length);
free(array);
Run Code Online (Sandbox Code Playgroud)

会做你显然想要的.