在 C 函数中更改数组

标签 c arrays function pointers

我正在学习 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 

最佳答案

您不能通过引用传递变量,您在函数内部分配的 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;
}

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

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

如果你想让函数替换之前的数组,它必须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;
}

然后在 main()

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

会做你显然想做的事。

关于在 C 函数中更改数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34844003/

相关文章:

c++ - 面向对象对嵌入式系统不利,为什么?

arrays - PowerShell - 是否每小时创建一个文件?

javascript - 在 Javascript/Jquery 中对对象数组进行子集化和编辑

c - 在 C 中帮助处理这个参差不齐的数组/子字符串程序?

c++ - 如何调用虚拟无效函数 C++?

c - 当 offset 递减传递给 mmap 时,mmap 调用失败

c 正则表达式代码不起作用?

function - 设计检查 bool 公式是真还是假的 DFA

c - _builtin_prefetch()中第二个参数的作用是什么?

postgresql - postgres 事件触发器和功能不起作用