You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何数组作为函数参数传入后原数组未被修改?如何正确修改?

为什么原数组未被修改?

在C语言中,数组作为函数参数传递时会自动退化为指向数组首元素的指针——也就是说void modifyArray(int arr[])完全等价于void modifyArray(int *arr)。

当你在main里调用modifyArray(arr)时,只是把原数组的首地址拷贝给了函数内部的局部指针变量arr。而函数里的arr = (int[]){6, 7, 8, 9, 10};操作,只是给这个局部指针变量重新赋值,让它指向了一个临时创建的复合字面量数组的地址——这完全不会影响main函数中原数组的内存地址和内容。函数执行结束后,这个局部指针就会被销毁,原数组的内存没有任何改动,所以输出还是初始值。


正确修改原数组的方法

要修改原数组的内容,需要直接操作原数组指向的内存空间,而不是修改函数内部的局部指针。以下是两种常用实现方式:

方式1:逐个元素赋值

遍历数组,将新值逐个写入原数组的对应位置:

#include <stdio.h>

void modifyArray(int arr[]) {
    int newVals[] = {6, 7, 8, 9, 10};
    for (int i = 0; i < 5; i++) {
        arr[i] = newVals[i]; // 直接修改原数组内存中的元素
    }
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    modifyArray(arr);
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr[i]); // 输出6 7 8 9 10
    }
}

方式2:使用memcpy批量拷贝

如果数组长度固定,可以用memcpy直接将新数组的内容批量拷贝到原数组的内存地址(需要包含<string.h>头文件):

#include <stdio.h>
#include <string.h>

void modifyArray(int arr[]) {
    int newVals[] = {6, 7, 8, 9, 10};
    memcpy(arr, newVals, sizeof(newVals)); // 批量拷贝内存内容
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    modifyArray(arr);
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr[i]); // 输出6 7 8 9 10
    }
}

补充说明

如果你的数组是动态分配的(用malloc/calloc),可以通过修改指针指向来替换整个数组,但需要注意释放原内存避免泄漏,示例如下:

#include <stdio.h>
#include <stdlib.h>

void modifyArray(int **arr) {
    // 释放原内存
    free(*arr);
    // 分配新内存并赋值(复合字面量在静态存储区,无需手动释放)
    *arr = (int[]){6, 7, 8, 9, 10};
}

int main() {
    int *arr = malloc(5 * sizeof(int));
    for (int i = 0; i < 5; i++) {
        arr[i] = i + 1;
    }
    modifyArray(&arr);
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr[i]); // 输出6 7 8 9 10
    }
}

但这种方法只适用于动态分配的数组,对于main中定义的栈数组(如原问题中的int arr[] = {1,2,3,4,5}),其内存地址是固定的,无法通过修改指针指向来替换。


内容的提问来源于stack exchange,提问作者Alphin Thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 21:23:12