为何数组作为函数参数传入后原数组未被修改?如何正确修改?
为什么原数组未被修改?
在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
相关产品推荐
相关产品推荐

